web-dev-qa-db-ja.com

Simple HTML Dom:要素を削除する方法は?

シンプルHTML DOMを使用して記事内のすべての画像を削除したいので、ニュースティッカー用の小さなテキストスニペットを簡単に作成できますが、要素を削除する方法がわかりません。

基本的に私はやる

  1. コンテンツをHTML文字列として取得する
  2. コンテンツからすべての画像タグを削除します
  3. コンテンツをxワードに制限する
  4. 出力。

助けがありますか?

36
kasakka

要素を削除する専用の方法はありません。すべてのimg要素を見つけてから

$e->outertext = '';
51
Gordon

外部テキストのみを削除すると、HTMLコンテンツ自体も削除されますが、同じ要素で別の検索を実行すると、結果に表示されます。その理由は、単純なHTML DOMオブジェクトには、実際のコンテンツがない場合にのみ、要素の内部構造が残っているためです。要素を実際に削除するために必要なことは、同じ変数に文字列としてHTMLを再ロードするだけです。このようにして、削除されたコンテンツなしでオブジェクトが再作成され、単純なHTML DOMオブジェクトが作成されます。

以下に関数の例を示します。

public function removeNode($selector)
{
    foreach ($this->find($selector) as $node)
    {
        $node->outertext = '';
    }

    $this->load($this->save());        
}

この関数をsimple_html_domクラス内に配置してください。

28
Dr. Reshef

保存するのを忘れたため、いくつかの困難があると思います(内部DOMツリーをダンプして文字列に戻します)。

これを試して:

$html = file_get_html("http://example.com");

foreach($html ->find('img') as $item) {
    $item->outertext = '';
    }

$html->save();

echo $html;
12
Sid

関数を配置する場所がわからなかったため、次のコードを直接コードに追加しました。

$html->load($html->save());

基本的に、forループで行われた変更を上記のhtmlにロックします。

4
JaseC

想定されるソリューションは非常に高価であり、大きなループやその他の種類の繰り返しでは実際には使用できません。

「ソフト削除」を使用したい:

foreach($html->find('somecondition'),$item){
    if (somecheck) $item->setAttribute('softDelete', true); //<= set marker to check in further code
    $item->outertext='';


   foreach($foo as $bar){
       if(!baz->getAttribute('softDelete'){
           //do something 
        }
    }

}
2
marcelde

これは私のために働いています:

foreach($html->find('element') as $element){
   $element = NULL;
}
1
baniadams

removeNodeを削除するためのより良い方法であるため、新しい回答を追加します。

$html->removeNode('img');

このメソッドは、受け入れられた回答にマークが付けられたときにおそらく利用できませんでした。それぞれを見つけるためにhtmlをループする必要はありません、これはそれらを削除します。

0
FRECIA