假设HTML包含15个表标记,每个表之前都有一个div标记,其中包含一些文本。我需要从HTML标记中的第10个表格标记之前的div标记中获取文本。我会怎么做?PHP DOM获取第N个表之前的标记
我能想到的唯一方法是使用爆炸('< table',$ html)将HTML拆分为多个部分,然后从具有正则表达式的爆炸数组的第9个值中获取最后一个div标记。有没有更好的办法?
我正在阅读PHP DOM documentation,但我看不到任何方法可以帮助我完成此任务。
假设HTML包含15个表标记,每个表之前都有一个div标记,其中包含一些文本。我需要从HTML标记中的第10个表格标记之前的div标记中获取文本。我会怎么做?PHP DOM获取第N个表之前的标记
我能想到的唯一方法是使用爆炸('< table',$ html)将HTML拆分为多个部分,然后从具有正则表达式的爆炸数组的第9个值中获取最后一个div标记。有没有更好的办法?
我正在阅读PHP DOM documentation,但我看不到任何方法可以帮助我完成此任务。
您load your HTML into a DOMDocument以及与此XPath表达式查询它:
//table[10]/preceding-sibling::div[1]
这将以下布局工作:
<div>Some text.</div>
<table><!-- #1 --></table>
<!-- ...nine more... -->
<div>Some other text.</div> <!-- this would be selected -->
<table><!-- #10 --></table>
<!-- ...four more... -->
XPath是能够轻松地做非常复杂的节点的查找。如果上述表达式尚未适用于您,则可能只需要很少的一点就可以实现您的目标。
HTML是以字符串表示的结构化数据,这与字符串大不相同。不要屈服于像explode()
这样的字符串处理函数或甚至正则表达式这样的东西的诱惑。
如果您不想学习xpath,您可以使用您在浏览器中使用JavaScript的相同的老派DOM行走技巧。
document.getElementsByTagName('table')[9]
然后抓取自己的方式在.previousSibling
值,直到你找到一个不是TextNode
,是div
我发现PHP的DOM文档工作得很好,有不完美的HTML,然后一旦有了DOM,我认为即使原始的HTML/XHTML结构不完美,你甚至可以将它传递给一个SimpleXML对象并使用它来处理XML风格。
请为上帝的爱去除正则表达式标签。你可能会想到一个人*实际上*为此提出了一个正则表达式解决方案! – Tomalak 2010-02-26 13:11:31
好多了,谢谢。 :-) – Tomalak 2010-02-26 13:19:32