preg_match не работает в php > 5.3

Я плохо разбираюсь в регулярных выражениях, поэтому даже не знаю, что именно делает это:

echo preg_match('/^(([a-zA-Z0-9\x2d]{1,63}\x2e)*[a-zA-Z0-9\x2d]{1,63}){1,254}$/', 'example12345678.com>');

Я взял его из более старой версии Zend Framework - 1.5, которая устарела и находится в в последней стабильной версии фреймворка это регулярное выражение больше не представлено.Тем не менее, его поведение любопытно, потому что я не нашел документированного объяснения или примечания об обратной несовместимости в официальных ресурсах php.

Дело в том, что на php 5.2.* работает нормально: возвращает 0. На php 5.3.10, 5.4.0 (скорее всего 5.3., 5.4.полагаю) возвращает FALSE, т.е. "ошибка".

Мой вопрос: почему? а в чем ошибка? Это регулярное выражение, какая-то рекурсия или двусмысленность правил? Почему это работает на php 5.2, если это так?


Интересно, что если я изменяю «example12345678.com>» на «example1234567.com>» (сокращая его на один или несколько символов) — он начинает работать и возвращает 0. Если я изменяю его на «123123123123123123123123123», он тоже работает. и возвращает 1.

UPD: пока не знаю, имеет ли это значение, но версии pcre здесь 8.02 (php 5.2) против 8.12 (php 5.3)


UPD2: я понимаю, для чего это нужно ... более или менее ... и сейчас нет проблем с тем, чтобы что-то заработало. Как я уже сказал, обновление Zend_Validate_* решает эту проблему. Я попытаюсь описать свою озабоченность другими словами:

скажем, я обновляю важную часть программного обеспечения, переключая php5.2 > php5.3. Я пытаюсь найти информацию обо всех проблемах, с которыми могу столкнуться (в основном, читая это: http://php.net/manual/en/migration53.php). Программное обеспечение немного старое, но не древнее, например. Zend Framework может иметь версию 1.5. Я проверяю/исправляю/анализирую и исправляю каждую поломку bc и устаревшую функцию. Даже мои модульные тесты работают нормально.

К моему удивлению, то, что описано в вопросе, происходит. (Если быть точным, Zend_Validate_Hostname выдает исключение).Итак, теперь я хочу знать, почему я пропустил это при обновлении и, что более важно, должен ли я перепроверить все «preg_match» (и другие функции, использующие PCRE) в приложении, пробуя различные вообразимые входные данные в попытке найти похожие «исправления ошибок». ".

Если это "исправление ошибки". Потому что это похоже на новую ошибку - раньше она работала как положено в php5.2 и больше не работает.

Надеялся получить какие-нибудь подсказки, чтобы сузить круг поиска.

6
задан lcf 18 May 2012 в 07:49
поделиться