假设HTML包含15个表标签,每个表之前都有一个div标签,里面有一些文本。我需要从HTML标记中的第10个表标记之前的div标记中获取文本。我该怎么做?
我能想到的唯一方法是使用explode('< table',$ html)将HTML拆分为多个部分,然后使用正则表达式从爆炸数组的第9个值中获取最后一个div标记。还有更好的方法吗?
我正在阅读PHP DOM documentation,但我看不到任何方法可以帮助我完成这项任务。
答案 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结构并不完美。