Версии PCRE в пхп

Тема в разделе "Регулярные выражения", создана пользователем dirdir, 29 июн 2012.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. dirdir

    dirdir Постоялец

    Регистр.:
    19 мар 2012
    Сообщения:
    94
    Симпатии:
    11
    Скажите пожалуйста. Есть файл со строками текста (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.

    Скажите как быть? Или придётся везде менять регулярки?
     
  2. xpert13

    xpert13 <(*_*)>

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

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

    Рекомендую проверять регулярки в RegexBuddy. Вот кстати как выглядит ваша при проверке (я её немного изменил, так как модификатора управляющего жадностью не нашел:(
    [​IMG]
     
Статус темы:
Закрыта.