匹配模式内的模式

时间:2011-01-04 22:26:04

标签: php regex dom

我正在尝试匹配<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;我只是认为这个特定的例子适用于正则表达式,因为它会执行以下操作:

  1. 查看第一个<sup>代码
  2. 找到</sup>
  3. 的第一个实例
  4. 在里面搜索(wild)(括号)(wild)(右括号)(wild)

5 个答案:

答案 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;”中的任何文字,那么您就可以了。但是,在上一个示例中,您还要考虑嵌套标记,并且可能是任意嵌套标记。所以我必须提醒你......

Don't parse html with regex!

答案 2 :(得分:0)

这不是正常行为吗?你有specified the ungreedy option的正则表达式吗?

答案 3 :(得分:0)

您可能无法使用一个正则表达式执行此操作。您将需要一个使用回调函数替换的函数,该函数将运行单独的正则表达式。

每个人提到的更好的方法是首先使用DOM对象来解析HTML。

答案 4 :(得分:0)

使用正则表达式解析html通常不是一个好主意。

请参阅Parsing Html The Cthulhu Way