正则表达式匹配段落标记之间的文本

时间:2014-03-02 21:09:31

标签: php regex pattern-matching

我试图仅匹配打开/关闭段落标记之间的内容。在RegExr上玩它,我可以<p.*?>匹配一个开头的段落标记,该标记可能有也可能没有任何其他属性,如类和/或ID。

但是,当我尝试将该模式添加到正面背后时,它会中断,我不知道为什么。我已尝试转义<>符号,但这似乎没有帮助。然而,展望未来完美无缺。

以下是整个模式的示例:

(?<=\<p.*?\>).*?(?=</p>)

我希望能够仅匹配段落标记中的内容,而不是包含标记本身。因此,为什么我试图使用前瞻和后视。

2 个答案:

答案 0 :(得分:3)

问题

使用lookbehinds的问题在于,在大多数正则表达式引擎中,不允许在其中使用重复。

(?<=.*)

由于*量词,这是无效的。如果它是{8},那就没关系,因为它是固定宽度。

解决方案

我的建议是匹配所有内容,并使用捕获组和反向引用来处理您的数据。

实施例

<p.*?>(.*?)<\/p>

因此,$1\1将包含您想要的数据。

答案 1 :(得分:1)

你不应该使用regex来完成这类任务。可以找到许多问题。 看这篇文章:Should I use regex or just DOM/string manipulation?

使用DOMDocument这很简单。

示例示例:

$str= "<p>tetsd</p> doutside <p> 232323234</p>";
$doc = new DOMDocument();
$doc->loadHTML($str);
foreach($doc->getElementsByTagName('p') as $para) {
    echo $para->textContent;
}

live demo