В последнее время нужно было использовать много регулярных выражений в PHP и после работы сделал для себя некоторые открытия о которых хотел бы рассказать.
Все мы знаем, что есть несколько типов регулярок и PHP поддерживает их все с помощью соответствующих библиотек идущих в комплекте стандартной библиотеки языка PHP. Разработчики PHP рекомендуют использовать самые совершенные и полные регулярные выражения Perl-совместимые (PCRE). Для работы с такими regexp в PHP есть функции начинающиеся с префикса preg_
. Perl-совместимые (PCRE) регулярки новее и лучше чем старые использовавшиеся в программах UNIX.
Собственно я расскажу именно про функцию preg_replace
, которая выполняет поиск и замену по регулярному выражению. У неё достаточно внушительная документация по сравнению с другими функциями в PHP, но всё дело в том, что этой документации следовать не до конца. Сразу скажу, что я проводил работу на PHP версии 5.5 и в будущем ситуация может измениться.
В общем в документации к функции preg_replace
даётся множество настоятельных рекомендаций по использованию, где разработчики PHP рекомендуют использовать немного иной подход к регуляркам, в частности ссылки на переменные (кармашки) рекомендуется создавать в виде $1
или так ${2}
подобно синтаксису переменных в самом PHP. При этом и нормальный базовый синтаксис отлично работает когда на переменные ссылаешься так \1
, \2
, но разработчики языка PHP настоятельно рекомендуют использовать именно их вариант.
В общем попробовал использовать рекомендуемый разработчиками PHP вариант и оказалось, что с ним связано множество разных ошибок. В частности если в самом шаблоне использовать ссылки на кармашки в стиле PHP, то получаются проблемы. preg_replace
когда доходит до ссылки на переменную и при этом не поймав само значение переменной начинает ругаться вместо того, что бы просто пропустить это и всё.
Было ещё много проблем из-за которых я делю вывод, что лучше использовать стандартный синтаксис PCRE и не слушать рекомендаций от PHP разработчиков, тем более сам движок для обработки регулярок написан на C++ и не ими, у них он попросту используется через некую прокладку.
Лучше использовать станадртный синтаксис переменных подстановок (\1, \2) кармашков в шаблонах и не юзать советы PHP и использование переменных типа $1, ${2} ибо при использовании таких переменных в самих шаблонах поиска это приводит к ошибкам.
В PHP строки содержащие регулярные выражения надо дополнительно заключать в одинаковые символы. В свой практике часто вижу, что люди в качестве этих символов используют обычны прямо слеш несмотря на то, что можно использовать почти любые символы, которые не используются в самом шаблоне. Часто получается, что слеш требуется в самом выражении и из-за этого происходят непредвиденные ошибки когда строка с регулярным выражением разрезается. В общем я крайне не рекомендую в качестве символов в которые заключается регулярка использовать слеши, уж очень часто они нужны. Лучше использовать символ решётки или какой-либо ещё редкий символ, так будет меньше проблем.