2009-12-19 65 views
16

我想在PHP中解析一些HTML與DOM,但我有一些問題。首先,如果這改變了解決方案,我擁有的HTML不是整頁,而只是它的一部分。如何解析部分HTML?

<!-- This is the HTML that I have --><a href='/games/'> 
<div id='game'> 
<img src='http://images.example.com/games.gif' width='300' height='137' border='0'> 
<br><b> Game </b> 
</div> 
<div id='double'> 
<img src='http://images.example.com/double.gif' width='300' height='27' border='0' alt='' title=''> 
</div> 
</a> 

現在我試圖得到唯一的ID爲double的股利。我試過下面的代碼,但它似乎沒有正常工作。我可能會做錯什麼?

//The HTML has been loaded into the variable $html 
$dom=new domDocument; 
$dom->loadHTML($html); 
$dom->preserveWhiteSpace = false; 
$keepme = $dom->getElementById('double'); 

$contents = '<div style="text-align:center">'.$keepme.'</a></div>'; 
echo $contents; 
+0

它正在做什麼或不做更換<br>? – 2009-12-19 17:50:15

回答

13

我想DOMDocument::getElementById不會工作你的情況:(報價)

對於此功能工作,你會 需要或者設置一些ID與DOMElement::setIdAttribute或 DTD定義屬性 類型ID爲 的屬性。
在後一種情況下,你 需要使用此功能與DOMDocument::validateDOMDocument->validateOnParse來驗證文檔 之前。


一個解決方案,可能會使用一些XPath query提取您正在尋找的單元工作。

首先,讓我們來加載HTML部分,就像你第一次做:

$dom=new domDocument; 
$dom->loadHTML($html); 
var_dump($dom->saveHTML()); 

var_dump這裏只是爲了證明HTML部分已成功加載 - 從它的輸出來看,它有。


然後,實例化的DOMXPath類,並用它來查詢元素你想:

$xpath = new DOMXpath($dom); 
$result = $xpath->query("//*[@id = 'double']"); 
$keepme = $result->item(0); 

我們現在必須元素,你想;-)


但,爲了將HTML內容注入到另一個HTML片段中,我們必須首先獲取它的HTML內容。

我不記得任何「簡單」的方法來做到這一點,但像這樣做前人的精力的伎倆:

$tempDom = new DOMDocument(); 
$tempImported = $tempDom->importNode($keepme, true); 
$tempDom->appendChild($tempImported); 
$newHtml = $tempDom->saveHTML(); 
var_dump($newHtml); 

而且......我們有你的double<div> HTML內容:

現在
string '<div id="double"> 
<img src="http://images.example.com/double.gif" width="300" height="27" border="0" alt="" title=""> 
</div> 
' (length=125) 


,你就必須做任何你想做的事情;-)

0

HTML整潔應該能夠「糾正」破碎的和零散的HTML文件,把它們變成東西,可以使用其他工具來解析

http://devzone.zend.com/article/761

整齊的擴展名是新的PHP 5, ,並且可從PHP版本 5.0b3向上獲得。它基於TidyLib庫,並允許 開發人員驗證,修復和 從PHP內部解析HTML,XHTML和XML文檔 。

3

DomDocument::getElementById

對於這個函數來工作,你將需要 要麼設置一些屬性ID與 ::一個DOMElement setIdAttribute或 DTD定義的屬性爲ID類型的 。在後一種情況下,您需要使用此函數在 之前使用DOMDocument :: validate或 驗證文檔 DOMDocument-> validateOnParse 。

對於一些更多的信息

而且因爲總會有人提到用正則表達式做早晚,這裏是你可以使用該模式: /<div id='double'>(.*)<\/div>/simU

在addi您可以使用常規字符串函數來提取div部分,例如

$div = strstr($html, '<div id="double">'); 
$div = substr($div, 0, strpos($div, '</div>') + 6); 
echo $div; 

雖然我同意,你不應該使用正則表達式或字符串函數用於解析 HTML或XML,我發現它絕對好做,只要你唯一關心的是得到這個單格從碎片。把事情簡單化。

+1

除非有嵌套的div標籤當然。正則表達式是* not *用於解析html。 – troelskn 2009-12-19 18:38:01

+0

我會同意,如果他真的*解析*片段。但他只是想從中提取一個明確定義的部分。這不像他正在遍歷DOM,所以我想可以把這個片段當作一個字符串來處理。 – Gordon 2009-12-19 18:43:31

+0

此外,我已經指出他在第一句中的SimpleHTML。 – Gordon 2009-12-19 19:06:12

0

一個XML文檔只能在根級別有一個元素。可能的話,HTML解析器也有類似的要求。嘗試將內容包裝在 <body/>標記中。

好像是別的。 This page描述了可能的原因。我建議你使用XPath來獲取元素。

-1

該片段是HTML,但要通過DOM解析它應該是XHTML。 每個打開的標籤必須關閉。

你的情況,這意味着你應該<br /><img ... ><img ... />

+0

實際上並非如此。 $ dom-> loadHTML( 「


」)工作得很好,並沒有失敗的解析。事實上,$ dom-> saveXML()會顯示你正確輸出封閉標籤。 – 2010-02-18 22:50:56

+0

這一切都取決於你使用的圖書館。在python中:xml.dom.minidom.parseString(「
」) - >返回一個異常。 xml.dom.minidom.parseString(「
」)的作品。我希望首先以正確的格式輸入輸入,而不是像我期望的那樣依賴庫來解析不正確的輸入。 – filippo 2010-02-19 08:55:55