PHP DOM在第N个表之前获取标记

时间:2010-02-26 13:03:24

标签: php html

假设HTML包含15个表标签,每个表之前都有一个div标签,里面有一些文本。我需要从HTML标记中的第10个表标记之前的div标记中获取文本。我该怎么做?

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

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

如果您不想学习xpath,可以使用与浏览器中使用的相同的老式DOM步行技术。

document.getElementsByTagName('table')[9]

然后向上抓取.previousSibling值,直到找到不属于TextNode并且为div

的值

我发现PHP的DOMDocument与非完美的HTML一起运行得非常好,然后一旦你拥有了DOM,我认为你甚至可以将它传递给SimpleXML对象并使用XML样式,即使是最初的HTML / XHTML结构并不完美。