обратная ссылка regex не работает в PHP PCRE - PullRequest
2 голосов
/ 26 апреля 2011

Я хочу сопоставить совпадающие теги, такие как <tag>...</tag>.Я попробовал регулярное выражение

~<([^>]+)>.*?</\1>~

, но это не удалось.Выражение сработало, когда я использовал точный текст в угловых скобках, т.е.

~<(tag)>.*?</tag>~

работает, но даже

~<(tag)>.*?</\1>~

не удается.

Я предполагаючто обратная ссылка здесь не работает.

Может кто-нибудь помочь мне, пожалуйста.Спасибо

PS: я не использую это для разбора HTML.Я знаю, что не должен.

Ответы [ 4 ]

9 голосов
/ 26 апреля 2011

Вы не показывали свой PHP-код, но я полагаю, у вас есть регулярное выражение в двойных кавычках.Если это так, то обратная ссылка \1 фактически преобразуется в символ ASCII до того, как она достигнет PCRE.(Все \123 последовательности интерпретируются как C-строка восьмеричные , ускользает оттуда.)

2 голосов
/ 26 апреля 2011

Это сработало для меня ...

$str = '<a></a>';

var_dump(preg_match('~<([^>]+)>.*?</\1>~', $str)); // int(1)

CodePad .

Кроме того, рассматривали ли вы XML-парсер ?Иначе ему не понравится фрагмент HTML, подобный этому ...

<a title="Is 4 > 6?"></a>

CodePad .

1 голос
/ 26 апреля 2011

Помимо того, что не всегда хорошая идея пытаться сопоставлять языки разметки с помощью регулярных выражений, ваше регулярное выражение выглядит нормально. Может быть, вы используете это неправильно?

if (preg_match('~<([^>]+)>.*?</\1>~', $subject, $regs)) {
    $result = $regs[0];
} else {
    $result = "";
}

должно работать.

0 голосов
/ 30 апреля 2016

Используйте одинарные кавычки в шаблоне

preg_match_all('/(sens|respons)e and \1ibility/', "sense and sensibility", $matches);
print_r($matches);
...