2010-09-27 91 views
4

這是我的示例腳本:如何使用PHP的DOMDocument獲取元素的序列化HTML?

$html = <<<HTML 
<div class="main"> 
    <div class="text"> 
    Capture this text 1 
    </div> 
    <div class="date"> 
    May 2010 
    </div> 
</div> 
<div class="main"> 
    <div class="text"> 
    Capture this text 2 
    </div> 
    <div class="date"> 
    June 2010 
    </div> 
</div> 
HTML; 

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 


$tags = $xpath->query('//div[@class="main"]'); 
foreach ($tags as $tag) { 
    print_r($tag->nodeValue."\n"); 
} 

這將出認沽:

Capture this text 1 May 2010 
Capture this text 2 June 2010 

但我需要它輸出:

<div class="text"> 
Capture this text 2 
</div> 
<div class="date"> 
June 2010 
</div> 

或至少能夠做這樣的事在我的foreach循環:

$text = $tag->query('//div[@class="text"]')->nodeValue; 
$date = $tag->query('//div[@class="date"]')->nodeValue; 
+0

這個問題是不是XPath表達式,但有關具體的DOM實現的方法。 – 2010-09-27 15:26:52

回答

6

那麼,nodeValue會給你節點的價值。你想要什麼俗稱outerHTML

echo $dom->saveXml($tag); 

將輸出你在找什麼在X(HT)ML兼容的方式。


由於PHP 5.3.6,你也可以通過一個節點saveHtmlwhich wasnt possible previously:

echo $dom->saveHtml($tag); 

後者將遵守HTML4語法。感謝Artefacto

+0

將這一個與JapanPro關於'innerHTML'的smidgin結合起來,我們可以使用'$ result =''; foreach($ tag-> childNodes as $ tag)$ result。= $ dom-> saveXML($ tag );'帶有原始的XPath。 – Wrikken 2010-09-27 18:53:32

+0

+1簡單易用一旦你知道如何:) – alex 2011-03-13 14:06:26

-1

試試這個

$dom = new DOMDocument(); 
$dom->loadHTML($html); 

$xpath = new DOMXPath($dom); 

$tags = $xpath->query('//div[@class="main"]'); 

foreach ($tags as $tag) { 
    $innerHTML = ''; 

    $children = $tag->childNodes; 
    foreach ($children as $child) { 
     $tmp_doc = new DOMDocument(); 
     $tmp_doc->appendChild($tmp_doc->importNode($child,true));  
     $innerHTML .= $tmp_doc->saveHTML(); 
    } 

    var_dump(trim($innerHTML)); 
} 

-Pascal MARTIN

+0

爲什麼投下來,沒有測試代碼。在投票時還留下一些反饋意見。 – 2010-09-27 16:10:36

+3

爲什麼它歸因於帕斯卡爾馬丁?你從他的答案中得到了代碼嗎? – alex 2011-03-13 14:06:52

+0

@帕斯卡我認爲複製和粘貼其他用戶的答案應該在這裏不鼓勵。 – alex 2011-03-13 14:33:23

相關問題