В последнее время я изучаю (на практике, чтобы сказать правду) регулярное выражение, и я замечаю его силу. Это требование, сделанное мной ( ссылка ), я знаю о «обратной реплике». Я думаю, я понимаю, как это работает, он работает в JavaScript, а в PHP – нет.
Например, у меня есть эта строка:
[b]Text B[/b] [i]Text I[/i] [u]Text U[/u] [s]Text S[/s]
И используйте следующее регулярное выражение:
\[(b|i|u|s)\]\s*(.*?)\s*\[\/\1\]
Это тестирование на regex101.com работает, то же самое для JavaScript, но не работает с PHP.
Пример preg_replace
(не работает):
echo preg_replace( "/\[(b|i|u|s)\]\s*(.*?)\s*\[\/\1\]/i", "<$1>$2</$1>", "[b]Text[/b]" );
Хотя этот способ работает:
echo preg_replace( "/\[(b|i|u|s)\]\s*(.*?)\s*\[\/(b|i|u|s)\]/i", "<$1>$2</$1>", "[b]Text[/b]" );
Я не могу понять, где я ошибаюсь, благодаря всем, кто помогает мне.
Это связано с тем, что вы используете двойную кавычку, внутри строки с двойными кавычками \1
читается как восьмеричная нотация символа (контрольный символ SOH = начало заголовка), а не как экранированный 1.
Итак, два способа:
используйте одинарную кавычку:
'/\[(b|i|u|s)\]\s*(.*?)\s*\[\/\1\]/i'
или вывести обратную косую черту, чтобы получить буквальную обратную косую черту (для строки, а не для шаблона):
"/\[(b|i|u|s)\]\s*(.*?)\s*\[\/\\1\]/i"
В стороне вы можете написать свой шаблон следующим образом:
$pattern = '~\[([bius])]\s*(.*?)\s*\[/\1]~i'; // with oniguruma notation $pattern = '~\[([bius])]\s*(.*?)\s*\[/\g{1}]~i'; // oniguruma too but relative: // (the second group on the left from the current position) $pattern = '~\[([bius])]\s*(.*?)\s*\[/\g{-2}]~i';