PHP正则表达式反向引用

时间:2009-10-15 10:05:24

标签: php regex

我正在尝试匹配html标记中的属性,但我无法使其正常工作:)

我们以此标记为例:

<a href="ddd" class='sw ' w'>

显然,最后一部分并不完全正确。

现在我尝试将属性部分与这段代码匹配:

preg_match('/(\s+\w+=(?P<quote>(\'|\"))[^(?P=quote)]*(?P=quote))*/U', " href=\"bla\" class='sw'sw'", $a);

这里$ a是空的,这就是我的期望。 但是,如果我现在接受我的完整表达, 匹配最后一个类部分,这让我很困惑。它看起来像这样:

preg_match('/<(?P<c>[\/]?)(?P<tag>\w+)(?P<atts>(\s+\w+=(?P<quote>(\'|\"))[^(?P=quote)]*(?P=quote))*)\s*(?P<sc>[\/]?)>/U', $tag, $a);

现在$ a返回:

Array
(
[0] => <a href="ddd" class='sw ' w'>
[c] => 
[1] => 
[tag] => a
[2] => a
[atts] =>  href="ddd" class='sw ' w'
[3] =>  href="ddd" class='sw ' w'
[4] =>  class='sw ' w'
[quote] => '
[5] => '
[6] => '
[sc] => 
[7] => 
)

注意包含类部分的键4,包括最后一个'w,而我最后使用了(U)ngreedy开关。

任何线索?

2 个答案:

答案 0 :(得分:1)

尝试使用正则表达式HTML真的是一个坏主意 - PHP有DOM Inspector可以做到这一点。

答案 1 :(得分:0)

  

[^(ΔP=引号)]

你做不到。字符类只包含单个字符,反斜杠转义和-范围;此字符类匹配任何文字字符()?P等。

此外,(?P=quote)不是反向引用,它是递归表达式。它需要前面定义的正则表达式:

(?P<quote>(\'|\"))

因此匹配“或”,无论在属性值的开头使用了哪个引号。Backrefs使用与\1匹配编号的()匹配组的表达式完成。

但无论如何,squeeks是对的:用正则表达式解析[X] [HT] ML是一场完全失败的游戏。你永远不会想出一个正确处理所有可能标记的表达式。不要浪费时间并使用XML或HTML parser