[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Возможен ли поиск без регулярок
silent_zzz
К примеру мне надо найти слова в тесте где встречаются слова в верхнем регистре с помощью регулярок сделать это не трудно получится примерно так ([A-ZА-Я]+)
А вот как реализовать подобное с помощью обычных функций для работы со строками.



Спустя 17 минут, 43 секунды (7.03.2009 - 16:22) twin написал(а):
Ну во первых ([A-ZА-ЯЁ]+), а во вторых, интересно зачем? Теоретически можно конечно, допустим разбить на символы и проверить принадлежность к массиву... Только регуляркой проще все это...

Спустя 8 минут, 5 секунд (7.03.2009 - 16:30) silent_zzz написал(а):
twin, спасибо что поправил tongue.gif
А это затем что быстрей работало, как известно регулярки не очень быстро работают, к примеру если текста очень много.
И по твоей теории, не ясно что будет это за массив? С которым сравниваются символы?


Спустя 2 минуты, 56 секунд (7.03.2009 - 16:33) vasa_c написал(а):
Кто сказал, что не очень быстро?

Спустя 3 минуты, 41 секунда (7.03.2009 - 16:37) twin написал(а):
Совсем не факт, что будет быстрее работать набор функций, заменяющих штатные... Массив из букв, которые нужны, а именно A-ZА-Я. Я чесно говоря вообще задачи не понял... Нужно просто узнать, есть ли в тексте верхний регистр или что то с этим текстом сделать?

Спустя 6 минут, 35 секунд (7.03.2009 - 16:43) silent_zzz написал(а):
vasa_c, а если взять к примеру какой нить substr и preg_match кто будет быстрей работать?

twin, задача собственно в том чтобы узнать есть ли слова в верхнем регистре и все.

Спустя 1 минута, 26 секунд (7.03.2009 - 16:45) vasa_c написал(а):
И кто будет работать быстрее? На каком примере? На какой системе? Какие тесты были проведены?

Спустя 4 минуты, 21 секунда (7.03.2009 - 16:49) silent_zzz написал(а):
vasa_c, ну тестов не проводил, но так сложилось в моем сознании при общении с более опытными программерами, что обычные строковые функции работают быстрей регулярок..

Спустя 3 минуты, 16 секунд (7.03.2009 - 16:52) vasa_c написал(а):
Вот то что складывается просто так в сознании и не подтверждается экспериментами, это самое вредное в программировании.

А "опытные программисты" пишут уйму статей по поводу того, что не используйте двойные кавычки, одинарные, дескать, быстрее.

А потом люди насилуют себе мозг оптимизацией микросекундных операций, при этом узнавая размер мегабайтных таблиц с помощью mysql_num_rows(mysql_query('SELECT * FROM `table`')).

Забейте вы на это и используйте то, что удобно. Зачем оптимизировать начали? Регулярка в вашем случае тормозить начала?

Спустя 10 минут, 29 секунд (7.03.2009 - 17:03) silent_zzz написал(а):
vasa_c, спасибо обязательно это учту для себя, но я пишу не для себя, и поэтому и хочеться написать что то более лучшее(что бы не доматывались)
На новой работе руководитель очень тщательно просматривает код и говорит что не так и что не правильно, так как система высоко нагрузочная.
Вот не давно я к примеру предложил такое решение задачи
PHP
foreach($words_arr as $k=>$v){
        $minres = substr_count($text,$k);
            if ($minres > 0){
                $matches_arr[$k] = $minres;
            }
        }

        asort($matches_arr);
        $srt = reset($matches_arr);
        return $srt;

где $words_arr обычный ассоциативный массив, задача состояла в том чтобы определить наименьшее значение у ключа.

Мне сказали что это полная херь и сделать надо так
PHP
$min=-1;
            foreach (array_keys($words_arr) as $word){
            $freq=isset($text_arr[$word])?$text_arr[$word]:0;
            $min=($min==-|| $min > $freq)?$freq:$min;
        }

Вот исходя из этого и хотелось бы решать задачи какими то и другими вариантами..

Спустя 16 минут, 50 секунд (7.03.2009 - 17:20) vasa_c написал(а):
Единственное, что я понял в этом примере, это то, что обычный перебор массива здесь заменён на вытаскивание всех его ключей в другой массив и перебор уже их. Ваш директор объяснил смысл данной оптимизации?

А после данной оптимизации вы провели замеры времени?

Спустя 1 минута, 57 секунд (7.03.2009 - 17:22) sergeiss написал(а):
Ну, насчет "микрооптимизации" уже сказали smile.gif

Цитата (silent_zzz @ 7.03.2009 - 17:03)
Мне сказали что это полная херь и сделать надо так
   
PHP
$min=-1;
            foreach (array_keys($words_arr) as $word){
            $freq=isset($text_arr[$word])?$text_arr[$word]:0;
            $min=($min==-|| $min > $freq)?$freq:$min;
        }

Вот исходя из этого и хотелось бы решать задачи какими то и другими вариантами..

А вот это я вообще не понял smile.gif У тебя код неоптимальный, это факт. Но и этот код тоже, мягко говоря, недалеко от твоего ушел.

Чем не нравится вот так - всё действие в одну строку:
PHP
$min=min( array_keys( $words_arr) );


PS. А при сравнении регулярок и символьных функций учти, что чем больше у тебя действий в ПХП, тем медленнее будет их выполнение. Потому что ПХП интерпретирует строки во время выполнения, а не заранее. Если начнешь работать с символьными строками, то будешь много "кодить" в ПХП. И вот тут можешь только потерять много.
Функции же работы с регулярками взяли параметры и работают - а внутри они состоят из скомпилированного кода, который заведомо быстрее, чем интерпретируемый.

Спустя 2 минуты, 4 секунды (7.03.2009 - 17:24) twin написал(а):
Если просто узнать, то так можно:
PHP
<?
$a "aaaaaaaa";
$b "ABCDEFGH";
echo (
strpbrk($a,$b))?"Есть":"Нету";

Спустя 4 минуты, 17 секунд (7.03.2009 - 17:28) silent_zzz написал(а):
vasa_c, померить хотел, но мне сразу же была поручена следующая задача, и во вторых я не сразу понял что он написал) Объяснил не очень внятно но по его выражению и эмоциям было ясно что это не что более крутое намного, и работать будет быстрее, так как я у себя постонянно обращаюсь к $text где собственно ищу количество совпадений в тексте.

Спустя 2 часа, 22 минуты, 9 секунд (7.03.2009 - 19:50) SpiderSpy написал(а):
я как то писал функцию, которая достает из текста слова которые удволетворяет, определнному условию, и я б сказал что куда дольше работает, чем регулярка.

Спустя 17 часов, 6 минут, 21 секунда (8.03.2009 - 12:56) silent_zzz написал(а):
а вот такой вопрос еще в связи с тем, что preg_replace пользовался один раз всего и то давно, подскажите как в массиве заменять полностью слово которое нашли а не только его вхождение к примеру ищем ну так же буквы с верхним регистром и удаляем их, вот если писать так
PHP
preg_replace('/([A-ZА-ЯЁ]{2,})/','',$text);

и если ищем по массиву с такими данными
PHP
$text = array(
1=> "АБВ",
2=> "Привет",
3=> "ПРивет");

то он выдаст такое - "Привет ивет"
А надо чтобы ивет не выводил..

Спустя 1 час, 45 минут, 24 секунды (8.03.2009 - 14:42) twin написал(а):
Ну если только первые, то нужно просто указать, что еще и маленькие могут быть:
PHP
<?
$text = preg_replace('/[A-ZА-ЯЁ]{2,}[а-я]*/','',$text);

Но это не сработает, если заглавная буква будет в конце или середине...
А чем мой вариант не угодил, вроде бы проще.

Спустя 53 минуты, 37 секунд (8.03.2009 - 15:35) silent_zzz написал(а):
twin, это который твой вариант?
вот этот?
PHP
<?
$a = "aaaaaaaa";
$b = "ABCDEFGH";
echo (strpbrk($a,$b))?"Есть":"Нету";

Просто у меня задача такая надо найти в массиве (состоит из предложений) слова где встречаются буквы в верхнем регистре и надо исключить такие предложения из массива...

Спустя 1 час, 47 минут, 32 секунды (8.03.2009 - 17:23) twin написал(а):
Ну вот так попробуй, правда на кирилице проверить не смог, к меня все на utf-8 настроено, а она чёт не хочет с многобайтными под utf работать...
PHP
<?
function 
sort_leter($a)
{
$b 'АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯ';
if(!
strpbrk($a,$b))
return 
$a;
else
return 
NULL;
}

$text array_map("sort_leter",$text);

Спустя 30 минут, 35 секунд (8.03.2009 - 17:54) silent_zzz написал(а):
Да работает! Круто!
А можно ли сделать чтобы функция брала только слова где идут от двух подряд буквы в верхнем регистре, а не от одной?

Спустя 6 минут, 24 секунды (8.03.2009 - 18:00) twin написал(а):
Сегодня банкет, завтра попробуем smile.gif

Спустя 2 минуты, 24 секунды (8.03.2009 - 18:02) silent_zzz написал(а):
думаю завтра ты не в состоянии будешь tongue.gif

Спустя 30 минут, 47 секунд (8.03.2009 - 18:33) twin написал(а):
Не, я пью мало, да и банкет чисто семейный. Мож еще седня сделаю. Только ты бы обрисовал задачу целиком, а то я делаю то, чего тебе и не надо совсем.

Спустя 12 часов, 20 минут, 5 секунд (9.03.2009 - 06:53) twin написал(а):
Вот смотри, условия так и не ясны. Во первых, не понятно:
1. проверяемая строка состоит из одного слова или из нескольких
2. в верхнем регистре разрешены только первые символы или по одному на любой позиции
Если слово одно и можно только первые, то совсем просто. Перед проверкой удаляем первый символ и все:
PHP
<?
function 
sort_leter($a)
{
$b 'АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЫЬЪЭЮЯ';
if(!
strpbrk(substr($a1),$b))
return 
$a;
else
return 
NULL;
}
а если все сложнее, то давай подробности.

Спустя 2 часа, 57 минут, 20 секунд (9.03.2009 - 09:51) silent_zzz написал(а):
как раз то что нужно! Спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.