2010-01-17 73 views
1

我有一個外部HTML源,我想刮,並轉換成本地XML文件或添加到MySQL數據庫。將HTML導入DOMDocument或SimpleXML時刪除內聯元素?

外部源主要是標準化和(有點)的語義,讓所有我需要做的就是使用XPATH讓所有td內容或全部li內容等的問題是,偶爾這些項目使用<strong><b><i>標籤來設計我需要的元素。

這在技術上是語義上的,因爲重點在於增加特定文本,開發人員可能希望使用不是瀏覽器默認值的CSS。

的問題是,我試圖抓住實際內容則認爲此內聯元素的一個孩子,讓PHP擴展像simplexmlDOMDocumentDOMNode這樣對待他們。例如:

<table> 
<tr><td>Thing 1</td><td>Thing 2</td></tr> 
<tr><td>Thing 3</td><td>Thing 4</td></tr> 
<tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr> 
</table> 

會導致:

[table] => 
    [tr] => 
     [td] => Thing 1 
     [td] => Thing 2 
    [tr] => 
     [td] => Thing 3 
     [td] => Thing 4 
    [tr] => 
     [td] => 
      [strong] => Thing 5 
     [td] => 
      [strong] => Thing 6 

顯然,上面是不太什麼simplexml的回報,但上面反映的普遍問題。

所以有一種方法,使用DOMDocument已經內置的參數或使用額外的複雜XPath查詢來獲取td元素的內容與任何孩子(如果有的話)剝奪了他們的後代狀態和所有內容視爲查詢元素的文本?

現在,唯一的解決辦法我是要麼:

一個)具有foreach循環,檢查每一個結果,如:使用正則表達式剝去任何<strong>標記出

$result_text = ($result -> strong) ? $result - strong : $result; 

b)中在將其導入到任何預構建的類(如simplexml或DOMDocument)之前,先將HTML字符串轉換爲HTML字符串。

回答

1

你不能只用strip_tags()去除額外的東西標記?

$table = simplexml_load_string(
    '<table> 
     <tr><td>Thing 1</td><td>Thing 2</td></tr> 
     <tr><td>Thing 3</td><td>Thing 4</td></tr> 
     <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr> 
    </table>' 
); 

foreach ($table->xpath('//td') as $td) 
{ 
    $content = strip_tags($td->asXML()); 
    echo $content, "\n"; 
} 
+0

我不確定這是否是最好的解決方案,但我接受它並不是基於'strip_tags'建議(這很聰明),而是基於asXML()建議,而這並沒有發生給我使用之前處理移動內容到一個數組。非常好。 – Anthony 2010-01-17 08:44:56

1

請在閱讀正則表達式解析html之前閱讀this的第一個答案,如果只是爲了娛樂的緣故。 XPath是答案,得到td的文本而不是繼續解析它。所以你只需要搜索//td之類的東西,然後把結果完全取出(而不是繼續樹木建築,這樣你就可以在樹葉上說出強烈的或者任何其他的東西)

0

如果你使用DOM文檔,一旦你選擇的DOMNode,物業textContent應該只包含它的文本部分和它的所有童裝... 正是你問什麼。

$table = '<table> 
     <tr><td>Thing 1</td><td>Thing 2</td></tr> 
     <tr><td>Thing 3</td><td>Thing 4</td></tr> 
     <tr><td><strong>Thing 5</strong></td><td><strong>Thing 6</strong></td></tr> 
    </table>'; 

$dom = new DOMDocument; 
$dom->loadHTML($table); 
$xpath = new DOMXPath($dom); 

$els = $xpath->query('//td'); 
echo $els->item(4)->textContent; //Thing 5 

或者,根據節點的類型,也可以檢查nodeValue。我不記得確切的區別,但textContent是你想要的。