假設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