【发布时间】:2011-05-30 23:27:59
【问题描述】:
使用 PHP 和 preg_match_all 我试图获取以下标签(以及标签)之间的所有 HTML 内容:
<p>paragraph text</p>
don't take this
<ul><li>item 1</li><li>item 2</li></ul>
don't take this
<table><tr><td>table content</td></tr></table>
我可以得到其中一个就好了:
preg_match_all("(<p>(.*)</p>)siU", $content, $matches, PREG_SET_ORDER);
有没有办法把所有的
<p></p> <ul></ul> <table></table>
包含单个 preg_match_all 的内容?我需要它们按被发现的顺序出现,这样我就可以呼应内容,这样才有意义。
因此,如果我对上述内容执行了 preg_match_all 然后遍历 $matches 数组,它将回显:
<p>paragraph text</p>
<ul><li>item 1</li><li>item 2</li></ul>
<table><tr><td>table content</td></tr></table>
【问题讨论】:
-
@mario:实际上两者兼而有之,只是有点夸张。重要的一点是:“正则表达式是一种不够复杂的工具,无法理解 HTML 使用的结构。HTML 不是正则语言,因此不能被正则表达式解析。”
-
你应该use an XML parser.(继续,也标记这条评论)
-
不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php。