[PHP5] Проблемы с регулярными выражениями
а так бы и не знал
Сообщение удалил
не надо
Не было, но баг странный, да.
Похоже, что в PHP4 изначальный лимит просто больше.
One comment about 5.2.x and the pcre.backtrack_limit:
Note that this setting wasn't present under previous PHP releases and the behaviour (or limit) under those releases was, in practise, higher so all these PCRE functions were able to "capture" longer strings.
With the arrival of the setting, defaulting to 100000 (less than 100K you won't be able to match/capture strings over that size using, for example "ungreedy" modifiers.
So, in a lot of situations, you'll need to raise that (very small IMO) limit.
The worst part is that PHP simply won't match/capture those strings over pcre.backtrack_limit and will it be 100% silent about that (I think that throwing some NOTICE/WARNING if raised could help a lot to developers).
There is a lot of people suffering this changed behaviour from I've read on forums, bugs and so on).
Hope this note helps, ciao :-)
Решение очевидно: переписать выражение так, что оно не бактрекилось миллионы раз
Вот еще обсуждение
Увеличение backtrack_limit приводит лишь к тому, что php5 зависает на длительное время:
code:[forum ~]$ php4 test.php |wc && php5 -d pcre.backtrack_limit=4294967295 test.php | wc
138 12 180
^C
\n\n\n... (\n\n\n..., \s\n\n..., \n\s\n..., ...)
надо переписывать регексп
UPD: ну или игнорировать ошибки и вместо возвращенного NULL использовать исходное значение
ШАМАН! : DD
В этом примере вообще можно (\s|\n) на \s заменить
Оставить комментарий
otets-mihail
Чуваки, а бывало ли у вас такое, что при переходе с php4 на php5 у вас переставали правильно работать функции с регулярными выражениями?(Вставьте сюда ваш любимый поисковик) сразу же выдает ссылку на сей дивный баг http://bugs.php.net/bug.php?id=36983 , но решения проблемы я пока так и не смог найти.
Увеличение backtrack_limit приводит лишь к тому, что php5 зависает на длительное время:
Более того, как я понял, обе версии php используют одну и ту же библиотеку PCRE, что весьма странно.
Мб кто сталкивался с решением, более изящным чем делать popen("perl -e <regexp function>") вместо preg_replace?