пятница, 30 сентября 2011 г.

Ужас PHP, летящий на крыльях ночи

Всех с наступающей ночью )

Только что чуть еще не добавил себе седых волос по причине программирования на PHP. В общем, ситуация. Имеется большой по размеру PHP-файл, где-то в середине которого присутствует регулярка вот такого вида:
===
...'#(<(?:img|a).*?(?:src|href)\s*=\s*["\']\s*)(.*?)(\s*["\'].*?>)#i'...
===
Всё нормально работает. Я потихоньку себе что-то там удаляю, добавляю комментарии, провожу изменения в коде и на каком-то этапе замечаю (вдруг!), что мой скрипт перестает выполняться вообще. PHP сообщает, что, мол, присутствует "unexpected $end" и указывает куда-то на последнюю строку скрипта.

В общем, методом проб и ошибок нашел я то место, из-за которого весь сыр-бор приключился. Разумеется, тут не обошлось без регулярки выше (а иначе зачем бы я её приводил, верно ? :) В общем, когда я эту строку закомментировал вот так:
==
// ... '#(<(?:img|a).*?(?:src|href)\s*=\s*["\']\s*)(.*?)(\s*["\'].*?>)#i'...
==
, то произошло страшное следующее. Как я понимаю, интепретатор PHP попытался проигнорировать всё, что дальше '//', включая кавычки, и не воспринимая сам литерал регулярки как строчную переменную, которую не нужно парсить. И в этой строке он обнаруживает последовательность "?>", которая говорит ему, что код PHP закончился. Ну и понятно, что это послужило причиной того, что его перекосило, если можно так сказать.
В общем, закомментировал я эту строку через /* и */, и всё заработало.
Но было весело )