Есть у меня регэксп, который служил мне верой и правдой до тех пор, пока я не обновил PHP с версии 5.1.4 до 5.2.3 (Win32). В ходе упрощения регулярного выражения я дошел до того, что выражение
/((.)*)*/ не матчит ничего (!) Само собой, мне это кажется абсурдом, я попробовал откатиться на 5.1.4 и о, чудо! выражение матчит все (как собсно и должно быть)!
Сравниваю информацию из phpinfo() этих версий и имею в PHP 5.1.4:
Код:
PCRE (Perl Compatible Regular Expressions) Support enabled
PCRE Library Version 6.6 06-Feb-2006
в PHP 5.2.3:
Код:
PCRE (Perl Compatible Regular Expressions) Support enabled
PCRE Library Version 7.0 18-Dec-2006
Проверьте сами:
Код:
<?php
var_dump(preg_match('/((.)*)*/', 'abc'));
?>
В версии 5.1.4 возващается "int(1)", в 5.2.3 -- "int(0)".
Удаление любой пары скобок или любой звездочки дает положительный результат уже в обоих версиях. Но я повторюсь, это упрощенный вариант, я просто выкинул из него все лишнее, чтобы отладить конкретную строку, которая не матчилась, таким образом выкинуть эти скобки или звездочки из исходного регэкспа -- невозможно...
Мой вопрос звучит так: с чем я столкнулся? С багом в
pcre 7.0 или с каким-то частным случаем, про который в документации сказано, что результат такого выражения непредсказуем или не регламентирован стандартом?