Ошибка PHP PCRE preg_replace

<?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?

Related of "Ошибка PHP PCRE preg_replace"

Кажется, вы хотите избежать специальных символов регулярных выражений. Эта функция уже существует и называется 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); 

Замечание: если вы действительно хотели сопоставить \[ в строке, регулярное выражение будет \\\\\[ . Понимаете, это может стать довольно уродливым.