Nikolino
@Nikolino

Почему в регулярке не работает backreference \1 но срабатывает \g1?

$text = '
<h2>This is the simplest string</h2>
<p>anything</p>

<h3>Another one</h3>
';
$pattern = "/<(h2|h3)([^>]*)>(.*)<\/\1>/";
preg_replace_callback($pattern, 'handleMatched', $text);

function handleMatched($m) {
    print_r($m);
}


Ничего не находит. (php 7.2)

А вот так: $pattern = "/<(h2|h3)([^>]*)>(.*)<\/\g1>/";
Находит.

В доках сказано, что: "The sequences \1, \g1 and \g{1} are synonymous with one another."
  • Вопрос задан
  • 30 просмотров
Решения вопроса 1
VlastV
@VlastV
Ведущий разработчик – практик
Для задания шаблона поиска вы используете двойные кавычки. В этом случае, в строке заменяются все служебные последовательности. Одной из таковых (не известных мне) является \1, доказательство:

php > var_dump("\1", '\1', "\g1", '\g1', "\\1");
string(1) ""
string(2) "\1"
string(3) "\g1"
string(3) "\g1"
string(2) "\1"


Как решение:
- дважды экранировать (\\1);
- использовать одинарные кавычки.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы