我正在尝试匹配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开关。
任何线索?
答案 0 :(得分:1)
尝试使用正则表达式HTML真的是一个坏主意 - PHP有DOM Inspector可以做到这一点。
答案 1 :(得分:0)
[^(ΔP=引号)]
你做不到。字符类只包含单个字符,反斜杠转义和-
范围;此字符类匹配任何文字字符(
,)
,?
,P
等。
此外,(?P=quote)
不是反向引用,它是递归表达式。它需要前面定义的正则表达式:
(?P<quote>(\'|\"))
因此匹配“或”,无论在属性值的开头使用了哪个引号。Backrefs使用与\1
匹配编号的()
匹配组的表达式完成。
但无论如何,squeeks是对的:用正则表达式解析[X] [HT] ML是一场完全失败的游戏。你永远不会想出一个正确处理所有可能标记的表达式。不要浪费时间并使用XML或HTML parser。