Помогите с паттэрном

SE

Guest
Помогите с паттэрном

preg_match("~\[$text\]~",$data,$result)
В общем в данном случане необходимо найти текст в скобках [$text] в переменной $data НО так чтобы все это было независимо от регистра

Во втором случае мне нужно искать в переменной $data переменную $text2 тоже без учета регистра

Просьба помоч в составлении паттэрна
 

Demiurg

Guest
SE
тебе нужно узнать имеется ли такая подстрока или определить положение ?


Alexos
заткнись
 

Alexos

Новичок
Demiurg
1. не уподобляйся пьяному грузчику
2. что тебе не нравится в моём ответе? информативность? :)
 

Alexos

Новичок
SE
Вообщем тебе совет.. не пиши реги не дочитав до конца теории.. будешь всё время спотыкаться.. по себе знаю.. :)
i (PCRE_CASELESS)
If this modifier is set, letters in the pattern match both upper and lower case letters.
и ещё.. субпаттерны должны быть в скобках..
Короче проще написать:
if (preg_match("/\[(".$text.")\]/i", $data, $match)) echo $match[1];
этот код вернёт тебе текст в скобках, если таковой будет..
но если честно не совсем понимаю зачем это нужно.. если тебе известно значение переменной $text, то зачем пихать его в рег, чтобы получить тоже самое?! :)
 

SE

Guest
Это для того что бы проверять переменную $data на налисие текста $text
 

Alexos

Новичок
Ну тогда просто
if (preg_match("/\[".$text."\]/i", $data, $match)) {do_what_u_want2do();}
круглые скобки тут не нужны
:)

-~{}~ 21.02.04 23:23:

и 3-й аргумент кстати тоже..
 

Demiurg

Guest
можно превести тект и искомое слово к нижнему регистру, потом искать с помошью [m]strpos[/m]. Вариант Алексоуса универсальностью не отличается.
 

Demiurg

Guest
>не совсем понял.. зачем тут такой изврат?
вопрос в том, что больший изврат - использовать мой метод или регулярные выражения для точного вхождения.
 

Alexos

Новичок
или регулярные выражения для точного вхождения
я по этой фразе SE
НО так чтобы все это было независимо от регистра
так понял что вхождение как раз не точное..
может быть:
AAA
Aaa
aAa
aaA
etc.
А еслиб оно было точным тогда ебстественно strpos - рулит!
 

Найч

Алгоритмик :-)
Alexos
можно превести тект и искомое слово к нижнему регистру, потом искать с помошью strpos.
Это и есть ответ с регистронезависимым вхождением. Проверка на наличие через strpos гораздо быстрее
 

SiMM

Новичок
Автор оригинала: Найч
Проверка на наличие через strpos гораздо быстрее
Это общая фраза или она адаптирована под данный конкретный случай? Можно узнать, чем вы руководствовались, утверждая это? В данном конкретном случае preg выполняется по тому же алгоритму, что и strpos, поэтому вызов "лишней" функции strtolower только вредит быстродействию. В отличии от вас, могу подтвердить свои слова примером:
PHP:
<?
 function getmicrotime(){
   $t=explode(' ',$x=microtime());
   return $t[0]+$t[1];
 }
 $text='\[$text\]';
 $data='preg_match("~\[$text\]~",$data,$result)
В общем в данном случане необходимо найти текст в скобках [$text] в переменной $data НО так чтобы все это было независимо от регистра

Во втором случае мне нужно искать в переменной $data переменную $text2 тоже без учета регистра

Просьба помоч в составлении паттэрна
';
 $t1=getmicrotime();
 for($i=10000;$i;--$i)preg_match("~\[$text\]~si",$data);
 $t2=getmicrotime();
 for($i=10000;$i;--$i)strpos(strtolower($data),"[$text]");
 $t3=getmicrotime();
 echo 'preg_match time='.($t2-$t1)."\n";
 echo 'strpos(strtolower) time='.($t3-$t2);
?>
Мой результат получился следующим:
Код:
X-Powered-By: PHP/4.2.3
preg_match time=0.357688903809
strpos(strtolower) time=1.31156301498
 

Crazy

Developer
SiMM, твой тест крив, ибо ты не учел кэширование паттернов при повторных обращениях. Замени "~\[$text\]~si" на "~\[$text$i\]~si" и почувствуй разницу.
 

SiMM

Новичок
Crazy, текст действительно крив :) (и дело не в учёте паттернов - $text='\[$text\]' правильно будет заменить на $text='$text' - иначе несуразица получится). А о кэшировании паттэрнов просто не знал.
 

Найч

Алгоритмик :-)
SiMM
Пояню, чем я руководствовался. Простой логикой. Функция разбора регулярок немаленькая - она не может выполняться по тому же алгоритму, что и поиск вхождения строки. Я как-то пробовал написать свой интерпретатор "условных значков" для поиска. В итоге на то чудище сейчас смотреть страшно)). Конечно, preg_match максимально эффективно писан, тут спору нет. Но ей надо проделать на порядок больше операций для расшифровки паттерна. Все.

Я даже запустил твой тест, но с дополнением от Crazy. Получил выигрыш от strpos в среднем в 5(пять) раз. Может, я где-то ошибаюсь?))

-~{}~ 22.02.04 13:42:

Но РВ имеют право на жизнь в случае _больших_ объемов данных. Там они действительно быстрее. Твое замечание по поводу strtolower абсолютно верно. На практике поиск в таких текстах без использования БД я не встречал.
 

SiMM

Новичок
Найч, просто я представляю, что preg_match, когда в регулярнике нет всевозможных "вариантов" (т.е. тупо дана строка без всевозможных наворотов RE) выполняется примерно так же, как и strpos - никаких "откатов" она не делает. Да, конечно, анализ наличия наворотов рэгекспов займёт некоторое время, однако не думаю, что оно ужасно большое. С дополнением от Crazy у меня тоже всё встало на свои места :) - просто может я невнимательно читал мануал, может ещё чего - но про кэширование регэкспов в PHP я услышал впервые.
 

Demiurg

Guest
Дело не в больших размерах данных. Регулярные выражения действительно ищут подстроку как искал бы на ниском уровне начинающий программист. Сначала искать первую букву из подстроки, потом сравниить следующую букву со второй буквой подстроки и тд. А для поиска подстрок имеются более быстрые алгоритмы.
 

Найч

Алгоритмик :-)
Demiurg
С этим никто и не спорит. Но перевод массива символов в нижний регистр заметно начинает мешать на больших объемах. И в итоге перекрывает все преимущества strpos. Посему не согласен с фразой
Дело не в больших размерах данных.
 
Сверху