正则表达式反向引用不能在PHP PCRE中工作

时间:2011-04-26 11:08:55

标签: php regex pcre

我希望匹配<tag>...</tag>等匹配代码。我试过了正则表达式

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

但这失败了。当我使用尖括号内的确切文本时,表达式起作用,即

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

有效,但即便

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

失败。

我假设后面的引用在这里不起作用。

请有人帮帮我。感谢

PS:我没有用它来解析HTML。我知道我不应该。

4 个答案:

答案 0 :(得分:9)

你没有显示你的PHP代码,但我猜你用双引号你的正则表达式。如果是这样,则反向引用\1实际上会在到达PCRE之前转换为ASCII字符。 (所有\123序列都被解释为C字符串octal在那里转义。)

答案 1 :(得分:2)

它对我有用......

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

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

CodePad

另外,您考虑过XML parser吗?否则它不会像这样的HTML片段......

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

CodePad

答案 2 :(得分:1)

除了使用正则表达式尝试匹配标记语言并不总是一个好主意之外,你的正则表达式看起来还不错。也许你使用它错了?

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

应该有用。

答案 3 :(得分:0)

在模式中使用单引号

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