<?php function pregForPreg($value) { $value = preg_replace(array('#\(#', '#\)#', '#\+#', '#\?#', '#\*#', '#\##', '#\[#', '#\]#', '#\&#', '#\/#', '#\$#', '#\\\\#'), array('\(', '\)', '\+', '\?', '\*', '\#', '\[', '\]', '\&', '\/', '\\\$', '\\\\'), $value); return $value; } $var = "TI - Yeah U Know [OFFCIAL VIDEO] [TAKERS] [w\LYRICS]"; $var = pregForPreg($var); //$var is now: // TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\LYRICS\] $var = preg_replace("#" . $var . "#isU", 'test', $var); echo $var;
И я получаю сообщение об ошибке: * Предупреждение: preg_replace (): Ошибка компиляции: PCRE не поддерживает \ L, \ l, \ N, \ U или \ u при смещении 50 в test.php в строке 13. *
Как сделать правильную функцию pregForPreg?
Кажется, вы хотите избежать специальных символов регулярных выражений. Эта функция уже существует и называется preg_quote()
.
Вы получаете ошибку, потому что вы не убегаете \
правильно:
TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\LYRICS\] // this is not escaped ------^
и \L
имеет особое значение в регулярном выражении Perl:
\L
Нижний регистр до\E
но не поддерживается в PHP PCRE ( Perl Differences ):
Следующие escape-последовательности Perl не поддерживаются:
\l, \u, \L, \U
Фактически они реализованы с помощью общей обработки строк Perl и не являются частью его механизма сопоставления шаблонов.
Обновить:
Очевидно, вы не можете использовать экранированную версию как значение и как шаблон, потому что в шаблоне \[
будет рассматриваться как [
но в значении \[
взято буквально. Вы должны сохранить экранированную строку в новой переменной:
$var = "TI - Yeah U Know [OFFCIAL VIDEO] [TAKERS] [w\LYRICS]"; $escaped = preg_quote($var); echo $escaped . PHP_EOL; // prints "TI - Yeah U Know \[OFFCIAL VIDEO\] \[TAKERS\] \[w\\LYRICS\]" $var = preg_replace('#' . $escaped . '#isU', 'test', $var); echo $var; // prints test
или проще:
$var = preg_replace('#' . preg_quote($var) . '#isU', 'test', $var);
Замечание: если вы действительно хотели сопоставить \[
в строке, регулярное выражение будет \\\\\[
. Понимаете, это может стать довольно уродливым.