需要 php 中正则表达式和负匹配的帮助
我正在尝试匹配一个段落:
<p>content</p>
一个简单的 (.*?)
可以工作,但有时该段落内部包含另一个段落,因此我的模式在第一段结束后匹配直到第二个。
导致我出现问题的段落如下所示:
<p><p><b>something</b></p>content</p>
如何匹配主段落而忽略该段落中的任何其他 p 标签?
我尝试过
<p>(.*?)(?<!</b>)</p>
但没有成功。
我正在使用 preg_match_all php 函数。
I am trying to match a paragraph:
<p>content</p>
A simple <p>(.*?)</p>
works, but sometimes that paragraph contains another paragraph inside so my pattern matchs after the first paragraph ends and not until the second one.
The paragraph that causes me the problem looks like this:
<p><p><b>something</b></p>content</p>
How can I match the main paragraph ignoring the any other p tags inside that one?
I tried
<p>(.*?)(?<!</b>)</p>
But it didn't work.
I am using preg_match_all php function.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
正则表达式对于解析嵌套标签来说很糟糕。这就是您使用 dom 或 xml 解析器的原因。
regex is terrible for parsing nested tags. That's why you use a dom or xml parser.
当我需要处理这样的情况时,我创建了一个递归函数 findClosingTag 来查找下一个结束标记的索引(例如
) 。如果该索引之前还有另一个开始标记(例如
),那么我会递归并查找接近该嵌套开始标记的位置。继续,直到到达原始标签的末尾。也许不是最有效的,但如果你不需要的话,可能比解析完整的 DOM 更好。
我现在没有代码片段,但它非常简单。
When I've needed to deal with situations like this, I've created a recursive function findClosingTag that looks for the next closing tag's index (e.g.
</p>
). If there's another opening tag (e.g.<p>
) before that index, then I recurse and look for the close to that nested start tag. Continue until you reach the end of the original tag. Maybe not the most efficient, but probably better than parsing a full DOM if you don't need that.I don't have the snippet laying around right now, but it's pretty straightforward.