Чтобы избежать двойных или одинарных кавычек, я использовал обратные ссылки регулярных выражений:
$strVal = '<div class="xclassname">Contents</div>';
$strVal = preg_replace("/([\"\'])/", "\\\\1", $strVal);
Обычно это давало мне эту строку (с тех пор):
"<div class=\"xclassname\">Contents</div>"
с двойными кавычками, правильно сбежавшими в стиле C++.
Но сегодня мой PHP 5.5.3 дает мне этот результат:
"<div class=\1xclassname\1>Contents</div>"
с двойными кавычками, замененными строкой bad\1.
Теперь я должен использовать это:
$strVal = preg_replace("/([\"\'])/", "\\\\\${1}", $strVal);
preg_replace() нестабилен в моей ОС Windows 7, иногда он дает один результат, в другие дни он дает другое?
Вы столкнулись с такой ситуацией и почему?
ДОБАВЛЕНО:
Я забыл, что мы обновили PHP 5.3 до PHP5.5.3 несколько недель назад, preg_repace() нестабильно в соответствии с версиями PHP, а не в функции даты-времени:
preg_replace("/([\"\'])/", "\\\\1", $strVal); // is OK for PHP5.3.x, but
preg_replace("/([\"\'])/", "\\\\1", $strVal); // is bad for PHP5.5.x.
preg_replace("/([\"\'])/", "\\\\\${1}", $strVal); // is good for PHP5.5.x.
Что это, у меня нет нескольких версий PHP, можете ли вы подтвердить?
preg_*
функции лучше работают с $1
в первую очередь, и рекомендуется использовать их. Тем не менее, почему бы просто не использовать addslashes
для этой задачи?