正则表达式以查找标签中的标签


regex to find tags within tags

我是正则表达式的新手。我希望选择块引号之间的所有内容,但想忽略其中有 p 标签的那些。

有人可以帮我吗?

以下内容可以通过preg_match()找到

<blockquote><a>this is a link</a><blockquote>

但不是这个

<blockquote><p><a>this is a link</a></p></blockquote>

正如@Dagon评论的那样,使用正则表达式解析HTML是一个坏主意™。

也就是说,如果我们做出几个假设是可能的:

  • 如果存在,<p>始终位于<blockquote>之后
  • <blockquote>永远不会嵌套

然后,我们可以使用以下正则表达式使用否定的前瞻断言来打折包含<p>的任何匹配项:/<blockquote>(?!<p>)(.*?)<'/blockquote>/ .

一个干净的方法是将 DOM 与 XPath 一起使用。

如果你想使用正则表达式,你可以试试这个模式:

$pattern = '~<blockquote'b[^>]*>(?:[^<]+|(?R)|<(?!/(?:blockquote|p)>))*</blockquote>~';

它处理嵌套的块引用标签,并且无论其位置如何,如果内部都有一个 p 标签,则不匹配。