Версии PCRE в пхп

Статус
В этой теме нельзя размещать новые ответы.

dirdir

Постоялец
Регистрация
19 Мар 2012
Сообщения
112
Реакции
16
Скажите пожалуйста. Есть файл со строками текста (windows-1251) Есть выражение.

PHP:
"#^([^\s]+\s+){5,}$#Umi";

Оно находит все строки, где больше или 5 слов (букв через пробел).

Но под одной версией ПХП, вдруг стало оно работать странным образом. Оно стало игнорировать строки. Т.е. две строки считать за 1.

В файле из строк.
aaaaaa aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa
bbbbbb bbbbbbbb bbbbbbbb bbbbbbbb
cccccc cccccccc cccccccc
cccccc cccccccc cccccccc
cccccc cccccccc cccccccc
cccccc cccccccc cccccccc
cccccc cccccccc cccccccc

Стало находить вот что.

array() {
[0]=>
string(43) "aaaaaa aaaaaaaa aaaaaaaa aaaaaaaa aaaaaaaa"
[2]=>
string(34) "bbbbbb bbbbbbbb bbbbbbbb bbbbbbbb"
[10]=>
string(51) "cccccc cccccccc cccccccc
cccccc cccccccc cccccccc"
[11]=>
string(51) "cccccc cccccccc cccccccc
cccccc cccccccc cccccccc"


Когда они внесли эти изменения в версию PCRE?

Всегда вроде было что
PHP:
"#^([^\s]+\s+){5,}$#Umi";

Ищи начало строки, затем любой символ кроме пробела, затем пробел, затем конец строки.

И если в конструкцию ([^\s]+\s+) попадал конец строки, то он не учитывался, т.к. при модификаторах Um надо было искать минимум и построчно. Т.к. ищу через preg_match_all.

Скажите как быть? Или придётся везде менять регулярки?
 
Поведение правильно, у вас просто регулярка не правильная. Вы знали, что
Код:
\s - Соответствует любому пробельному символу. Эквивалентно [ \f\n\r\t\v]
Т.е. знакам переноса тоже. Единственное, что не понятно, как вас в результатах оказалась строка "bbbbbb bbbbbbbb bbbbbbbb bbbbbbbb", в которой только 4 группы, при том, что в регулярке указано минимум 5.

То, что раньше работало, скорее всего баг и по всей видимости его пофиксили.

Рекомендую проверять регулярки в RegexBuddy. Вот кстати как выглядит ваша при проверке (я её немного изменил, так как модификатора управляющего жадностью не нашел:(
fcc5ddd4f58d9fbd23af216224af87ea.png
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху