2010-02-26 57 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風格。