我正在尝试匹配<sup>
代码中的任何括号中的项目。
我的正则表达式过于贪婪,从第一个<sup>
标记开始,到最后一个</sup>
标记结束。
/<sup\b[^>]*>(.*?)\[(.*?)\](.*?)<\/sup>/
示例html:
<sup>[this should be gone]</sup>
<sup>but this should stay</sup>
<sup>this should [ also stay</sup>
[and this as well]
<sup><a href="#">[but this should definitely go]</a></sup>
知道为什么吗?
谢谢!
编辑:我认为这些答案是有道理的。我已经解析了很多没有正则表达式的HTML;我只是认为这个特定的例子适用于正则表达式,因为它会执行以下操作:<sup>
代码</sup>
答案 0 :(得分:2)
你真的不能这样做。 It's impossible to parse HTMl with regular expressions,因为正则表达式只能匹配常规语言;这些语言是我们使用的实际语言的一个更简单的子集。一种非常常见的非 - 正则语言是平衡括号的Dyck语言;无法将正确嵌套的括号与正则表达式匹配。如果您考虑它,HTML就与此相同,标签替换括号。因此,匹配(a)正确嵌套的sup
标签是不可能的,并且(b)匹配平衡括号是不可能的。我自己不使用PHP,但我知道它可以访问HTML DOM;我建议改用它。然后,对每个sup
标记进行过滤,并检查每个标记的内部文本。如果您只想捕获内部文本仅为[...]
的标记,...
不包含方括号,则可以使用^\[[^\]]+\]$
作为正则表达式;如果你想要真正的嵌套,则需要进行更复杂的检查。
答案 1 :(得分:0)
如果您的要求是专门删除“<sup>[
”和“]</sup
&gt;”中的任何文字,那么您就可以了。但是,在上一个示例中,您还要考虑嵌套标记,并且可能是任意嵌套标记。所以我必须提醒你......
答案 2 :(得分:0)
这不是正常行为吗?你有specified the ungreedy option的正则表达式吗?
答案 3 :(得分:0)
您可能无法使用一个正则表达式执行此操作。您将需要一个使用回调函数替换的函数,该函数将运行单独的正则表达式。
每个人提到的更好的方法是首先使用DOM对象来解析HTML。
答案 4 :(得分:0)
使用正则表达式解析html通常不是一个好主意。