2010-02-26 49 views
0

假设HTML包含15个表标记,每个表之前都有一个div标记,其中包含一些文本。我需要从HTML标记中的第10个表格标记之前的div标记中获取文本。我会怎么做?PHP DOM获取第N个表之前的标记

我能想到的唯一方法是使用爆炸('< table',$ html)将HTML拆分为多个部分,然后从具有正则表达式的爆炸数组的第9个值中获取最后一个div标记。有没有更好的办法?

我正在阅读PHP DOM documentation,但我看不到任何方法可以帮助我完成此任务。

+0

请为上帝的爱去除正则表达式标签。你可能会想到一个人*实际上*为此提出了一个正则表达式解决方案! – Tomalak 2010-02-26 13:11:31

+0

好多了,谢谢。 :-) – Tomalak 2010-02-26 13:19:32

回答

2

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()这样的字符串处理函数或甚至正则表达式这样的东西的诱惑。

1

如果您不想学习xpath,您可以使用您在浏览器中使用JavaScript的相同的老派DOM行走技巧。

document.getElementsByTagName('table')[9] 

然后抓取自己的方式在.previousSibling值,直到你找到一个不是TextNode,是div

我发现PHP的DOM文档工作得很好,有不完美的HTML,然后一旦有了DOM,我认为即使原始的HTML/XHTML结构不完美,你甚至可以将它传递给一个SimpleXML对象并使用它来处理XML风格。