2011-07-23 68 views
2

我在嘗試刪除xhtml中的節點時出現錯誤。
的代碼是:
foreach($post->getElementsByTagName('a') as $key=>$a) { $post->removeChild($a); }php dom removeChild錯誤問題

致命錯誤:未捕獲的異常 '拋出:DOMException' 與消息 '未找到錯誤' 在/var/www/content.php(24):內容 - >取()#2 {main}拋出192行中的/var/www/content.php

如果我使用img標籤,它會刪除除img節點以外的所有節點,並且不會導致致命錯誤。
這是怎麼回事?

回答

10

嘗試:

$a->parentNode->removeChild($a); 
+0

沒有錯誤,但它不會刪除標籤 – sam

+1

@sam你可以添加一些xml和你正在閱讀的代碼嗎? – Yoshi

+0

它與一些HTML工作,它的工作原理 – niahoo

3

getElementsByTagName返回DOMNodeList。 A DOMNodeList是遲到的。例如。如果您更改文檔,您還將更改節點列表。因此,如果您計劃更改文檔,則應將節點列表讀入數組,然後循環訪問數組。對於閱讀操作,它會像數組一樣工作,所以在這裏你會很好。

所以:

$nodes = array(); 
foreach ($post->getElementsByTagName('a') as $node) { 
    $nodes[] = $node; 
} 
foreach ($nodes as $node) { 
    $post->removeChild($node); 
} 
+0

讀節點列表到一個數組! ($ post-> getElementsByTagName('a')as $ key => $ a){$ atags [] = $ a},然後遍歷$ atags數組。我試過了,但是出現同樣的錯誤! – sam

+2

@troelskn @sam問題不在於你在循環中更改文檔,而是'$ post-> getElementsByTagName'搜索'$ post'下的整個節點樹。所以如果找到的'$ node'不是'$ post'的直接子元素,那麼使用'$ post-> removeChild'就可以給出一個錯誤。 – Yoshi

+0

因此,如果一個標籤包裝在一個p標籤中,它會給這個錯誤? – sam

0

這並沒有真正解決你的問題,我不是太肯定,但它看起來像你試圖刪除來自帖子的HTML標籤。是不是內置功能strip_tags()[docs]更適合這個嗎?

+0

是的,我試圖刪除html標籤,但不是集體,我正在評估屬性,然後有選擇地刪除標籤。 – sam

1

進入類似的問題,這是什麼工作,我刪除HTML標籤的所有元素,其他答案造成的錯誤。我正在使用HTML。希望這可以幫助某人。必須使用for語句,因爲節點列表和DOM是動態的。

$nodes = $dom->getElementsByTagName('a') 
for ($i = 0; $i < $nodes->length; $i++) { 
        $node = $nodes->item($i); 
        $node->parentNode->removeChild($node); 
        $i--; 
       } 

或while語句:

while($nodes->length) { 
        $node = $FlavorNodes->item(0); 
        $node->parentNode->removeChild($node); 
       }