当相同的元素类型嵌套在外部 HTML 元素中时,如何使用正则表达式捕获外部 HTML 元素?
我正在尝试使用正则表达式捕获 HTML 的某些部分,但遇到了一种我不知道如何解决的情况。
我有一个像这样的 HTML 片段:
<span ...> .... <span ...> ... </span> ... </span>
一个 元素,其中嵌套了另一个
元素。
我已经成功地使用以下正则表达式(在 PHP 的 preg_match()
/ preg_match_all()
中)来捕获整个 HTML 元素:
@<sometag[^>]+>.*?</sometag>@
这将捕获给定的起始标记和所有内容到相同类型的结束标记。
但是,在上述情况下,这将捕获起始 以及遇到的 下一个 结束
之前的所有内容,所以我得到的是这样的:
<span ...> .... <span ...> ... </span>
即外部起始标签,然后是直到内部跨度的起始标签的所有内容,然后是直到内部跨度的结束标签的所有内容,这当然不是我想要的。
我真正想要的是外部 元素及其内部的所有内容,包括内部嵌套的
。
有什么实际的方法可以实现这一目标吗?
注意:使用 XML 解析器解析 HTML 可能不是一个选项,因为我正在处理的 HTML 是旧的,并且来自 MS FrontPage 的 HTML 4 非常损坏,任何解析器都会被阻塞。
感谢您的帮助!
I'm trying to capture certain parts of HTML using regular expressions, and I've come across a situation which I don't know how to resolve.
I've got an HTML fragment like this:
<span ...> .... <span ...> ... </span> ... </span>
so, a <span>
element into which another <span>
element is nested.
I've been successfully using the following regex (in PHP's preg_match()
/ preg_match_all()
) to capture entire HTML elements:
@<sometag[^>]+>.*?</sometag>@
This would capture a given starting tag and everything up to the closing tag of the same type.
However, in the situation above, this would capture the starting <span>
and everything up to the next closing </span>
encountered, so what I get is this:
<span ...> .... <span ...> ... </span>
that is, the outer starting tag, then everything until the starting tag of the inner span, then everything up to the closing tag of the inner span, which, of course, is not what I want.
What I really wanted is the outer <span>
element complete with everything that is inside it, including the inner nested <span>
.
Is there any practical way to achieve this?
Note: parsing the HTML using an XML parser is probably not an option, as the HTML I'm working on is old and very broken HTML 4 coming out of MS FrontPage that any parser would choke on.
Thanks for any help!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
显然,“正确”的答案是使用 DOM 解析器而不是正则表达式,但你说你的标记对于解析器来说太糟糕了。
不过,在求助于正则表达式之前,请检查 simpleHTMLDOM 是否可以理解它。与基于 PHP DOM 的解析器相比,它对损坏的标记更加宽容。
Obviously, the "right" answer is to use a DOM parser instead of regex, but you say your markup is too broken for a parser.
Before resorting to a regex, though, check out whether simpleHTMLDOM can make sense out of it. it is a bit more lenient towards broken markup than the PHP DOM based parsers.