Использование регулярных выражений в PHP

В последнее время нужно было использовать много регулярных выражений в 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 строки содержащие регулярные выражения надо дополнительно заключать в одинаковые символы. В свой практике часто вижу, что люди в качестве этих символов используют обычны прямо слеш несмотря на то, что можно использовать почти любые символы, которые не используются в самом шаблоне. Часто получается, что слеш требуется в самом выражении и из-за этого происходят непредвиденные ошибки когда строка с регулярным выражением разрезается. В общем я крайне не рекомендую в качестве символов в которые заключается регулярка использовать слеши, уж очень часто они нужны. Лучше использовать символ решётки или какой-либо ещё редкий символ, так будет меньше проблем.