我是正则表达式的新手。我希望选择块引号之间的所有内容,但想忽略其中有 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 标签,则不匹配。