在php中需要有关正则表达式和负面匹配的帮助

时间:2011-02-06 04:11:32

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

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

<p>content</p>

一个简单的<p>(.*?)</p>有效,但有时该段落里面包含另一个段落,因此我的模式在第一段结束后匹配,而不是直到第二段。

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

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

如何匹配主段落,忽略该段落内的任何其他p标签?

我试过

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

但它不起作用。

我正在使用preg_match_all php函数。

2 个答案:

答案 0 :(得分:3)

正则表达式对于解析嵌套标记非常糟糕。这就是你使用dom或xml解析器的原因。

答案 1 :(得分:0)

当我需要处理这样的情况时,我创建了一个递归函数 findClosingTag ,用于查找下一个结束标记的索引(例如</p>)。如果在该索引之前还有另一个开始标记(例如<p>,那么我会递归并查找该嵌套开始标记的关闭。继续,直到到达原始标记的末尾。也许不是最有效的,但可能比解析完整的DOM更好,如果你不需要它。

我现在没有片段,但它非常简单。