Intereting Posts
Не удалось открыть «страницы /» для включения (include_path = '; C: \ Program Files (x86) \ DevDesktop \ common \ pear') index.php в строке 18 Регулярное выражение для шаблонов слишком сильно захватывает Как войти в phpMyAdmin с помощью WAMP, что такое имя пользователя и пароль? http: // localhost / не работает в Windows 7. В чем проблема? Как проверить, есть ли в нем URL-адрес страницы или нет с PHP? Почему декремент NULL не отрицателен в этом массиве? PHP Возвращение нескольких строк Разница PHP в месяцах между двумя датами? Статический метод get – это плохая практика? Symfony 1.4: лучший способ обеспечить загрузку файла без использования шаблона / представления AWS Elastic Beanstalk: запуск сценария Cron.d, отсутствие переменных среды Как развернуть результаты запроса для бесконечного прокрутки? Странное поведение с плавающей запятой PHP Загрузите несколько файлов на сервер и Вставка значений флажка в базу данных MySQL с помощью PHP

Backreference не работает в PHP

В последнее время я изучаю (на практике, чтобы сказать правду) регулярное выражение, и я замечаю его силу. Это требование, сделанное мной ( ссылка ), я знаю о «обратной реплике». Я думаю, я понимаю, как это работает, он работает в 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';