【问题标题】:Need help with regex and negative match in php在 php 中需要正则表达式和负匹配方面的帮助
【发布时间】:2011-02-06 04:11:31
【问题描述】:

我正在尝试匹配一个段落:

<p>content</p>

一个简单的&lt;p&gt;(.*?)&lt;/p&gt; 有效,但有时该段落内部包含另一个段落,因此我的模式在第一段结束后匹配,直到第二段结束。

导致我出现问题的段落如下所示:

<p><p><b>something</b></p>content</p>

我怎样才能匹配主要段落而忽略该段落中的任何其他 p 标签?

我试过了

<p>(.*?)(?<!</b>)</p>

但是没有用。

我正在使用 preg_match_all php 函数。

【问题讨论】:

  • 为什么不使用 HTML 解析器?
  • 因为我正在处理具有很多模式的现有代码,而这种模式是唯一不起作用的,我不想从头开始重新编码。

标签: php regex preg-match-all regex-negation


【解决方案1】:

正则表达式对于解析嵌套标签很糟糕。这就是您使用 dom 或 xml 解析器的原因。

【讨论】:

  • 你在这里真是太棒了!那天你在 PHPFreaks 上帮了我很多忙!
  • 我想强调这一点。正则表达式不仅仅是解析嵌套标签的“可怕”。他们无能为力。正则表达式无法解析嵌套结构。他们从根本上,在数学上,可证明没有这种能力。还可以查看关于 SO 的许多问题中的任何一个,人们会问他们如何使用正则表达式来解析 HTML。
【解决方案2】:

当我需要处理这样的情况时,我创建了一个递归函数 findClosingTag 来查找下一个结束标记的索引(例如 &lt;/p&gt;)。如果有另一个开始标签(例如&lt;p&gt;之前那个索引,然后我递归并寻找接近那个嵌套的开始标签。继续,直到到达原始标签的末尾。也许不是最有效的,但如果你不需要的话,可能比解析一个完整的 DOM 更好。

我现在没有 sn-p,但它很简单。

【讨论】:

  • 谢谢,这似乎是一个不错的解决方案,我现在已经使用 preg_replace 快速而讨厌的“hack”解决了它,并删除了导致问题的第二个

猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多