2017-05-05 138 views
-2

現在已經嘗試了將近一個小時。儘管每個人都堅持簡單直接,但它正在使用DOMDocument處理XML/HTML,我沒有找到正確的答案。PHP DOMDocument,通過Id刪除元素

如何從這個簡單的html中完全刪除元素id = delete_me?

<div class="something"> 
important stuff 
<div id="delete_me"> 
not so important stuff, better delete me 
</div> 
</div> 

這樣的結果僅僅是

<div class="something"> 
important stuff 
</div> 

我不會那麼困難。每當我必須使用DOMDocument時,我都會瘋了。

這是一個這樣簡單的問題和每一天的任務,但我仍然無法找到一個可行的解決方案。

幫助將非常感激。

回答

1

libxml的某些版本需要使用doctype才能使getElementById正常工作,因此這裏採用了相當「拙劣」的方法,它可以稍微哄騙libxml。

$doc='<!doctype>'; 

    $html=' 
     <div class="something"> 
      important stuff 
      <div id="delete_me"> 
       not so important stuff, better delete me 
      </div> 
     </div>'; 

    /* append the doctype */ 
    $html=$doc . $html; 

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

    /* get the element to be deleted */ 
    $div=$dom->getElementById('delete_me'); 

    /* delete the node */ 
    if($div && $div->nodeType==XML_ELEMENT_NODE){ 
     $div->parentNode->removeChild($div); 
    } 
    echo $dom->saveHTML(); 
    $dom=null; 

或者使用DOMXPath通過查詢ID查找元素和刪除。

$html=' 
     <div class="something"> 
      important stuff 
      <div id="delete_me"> 
       not so important stuff, better delete me 
      </div> 
     </div>'; 
    $dom=new DOMDocument; 
    $dom->validateOnParse = false; 
    $dom->loadHTML($html); 
    $xp=new DOMXPath($dom); 

    $col = $xp->query('//div[ @id="delete_me" ]'); 
    if(!empty($col)){ 
     foreach($col as $node){ 
      $node->parentNode->removeChild($node); 
     } 
    } 
    echo $dom->saveHTML(); 
    $dom=null;