2017-05-05 7 views
-2

今、ほぼ1時間試しています。誰もがDOMDocumentを使ってXML/HTMLを処理するのがいかに簡単で簡単かを主張していますが、私は適切な答えを見つけることはできません。PHP DOMDocument、Idで要素を削除

この単純なhtmlから要素id = delete_meを完全に削除するにはどうすればよいですか?結果はもっぱら

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

されるように

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

は、私はそれは難しいことはできません。私はDOMDocumentを使わなければならないたびにナッツをしています。

これは、このような単純な質問であり、毎日の仕事ですが、まだ解決策を見つけることができません。

助けていただければ幸いです。

答えて

1

libxmlの特定のバージョンでは、getElementByIdが正しく動作するように、doctypeが存在する必要があります。したがって、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; 
関連する問題