2011-07-12 96 views
2

搶的innerHTML我試圖用<bar>元素來取代一個DOMDocument所有<foo>元素。做到這一點的最好方法似乎是用getElementsByTagName獲取所有的<foo>元素,然後創建新元素來替換它們。如何從的DOMNode

問題是,我看不到從被替換的元素中獲取innerHTML。 nodeValue和textContent都返回內部文本,但內部標籤被剝離。我怎樣才能從DOMElement中獲得類似於「innerHTML」的內容?

示例代碼:

function convertTags($doc, $type) { 

$bad_nodes = $doc->getElementsByTagName($type); 

foreach($bad_nodes as $bad_node) { 
    $good_node = $doc->createElement("bar", $bad_node->nodeValue); 
    $bad_node->parentNode->replaceChild($good_node, $bad_node); 
} 

return $doc; 
} 
+0

爲什麼你不只是'str_replace函數( '<富', '<酒吧',$文本)'? – kongr45gpen

+0

@ Kongr45pen:因爲這實際上意味着用正則表達式解析HTML。 – jasso

回答

3

我想你可以通過治療他們像實際節點做的更好:

$good_node = $doc->createElement('bar'); 
foreach($bad_node->childNodes as $kid) 
{ 
    $good_node->appendChild($kid); 
} 
+0

+1這個。無論如何,如果_has_是一個字符串,用'$ string。= $ doc-> saveHTML($ kid);' – Wrikken

+0

'來代替'appendNode'調用這似乎在理論上起作用,但最終並沒有實際追加所有$ bad_node的孩子。看起來,當第一個子節點被追加時,以某種方式鏈接到子節點的其餘部分被打破。因此,$ good_node只會獲得一個(空)節點,即使有許多子節點。 –

+0

我爲此+1了,但仔細檢查後,appendNode()是什麼?它應該是'appendChild()'(http://www.php.net/manual/en/domnode.appendchild.php)? – LarsH

0

使用DOMDocument::saveHTML()方法,並指定要轉儲節點。如果我沒有理解它在你的榜樣節點您想提取的HTML,你可以試試:

foreach($bad_nodes as $bad_node) { 
    $good_node = $doc->createElement("bar", $bad_node->nodeValue); 
    $bad_node->parentNode->replaceChild($good_node, $bad_node); 

    // Call saveHTML on the node you want to dump. 
    $doc->saveHTML($bad_node); 

} 
+0

沒有改變最終返回的內容 - 所有正確的文本,但所有的標籤都被剝離了。我覺得它跟$ doc-> createElement(「bar」,THIS_METHOD_RIGHT_HERE)有關,它實際上並沒有返回HTML w/tags等 - 只是內部值。 –

0

如果你移動你的壞元素的所有子節點到你的好元素,而是會發生什麼?如果不使用innerHTML類型的方法,這可以做到嗎?

我相信saveHTML()方法應該返回你把它應用到該節點的標記,如果這是給您的任何幫助。