シンプルHTML DOMを使用して記事内のすべての画像を削除したいので、ニュースティッカー用の小さなテキストスニペットを簡単に作成できますが、要素を削除する方法がわかりません。
基本的に私はやる
助けがありますか?
要素を削除する専用の方法はありません。すべてのimg要素を見つけてから
$e->outertext = '';
外部テキストのみを削除すると、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クラス内に配置してください。
保存するのを忘れたため、いくつかの困難があると思います(内部DOMツリーをダンプして文字列に戻します)。
これを試して:
$html = file_get_html("http://example.com");
foreach($html ->find('img') as $item) {
$item->outertext = '';
}
$html->save();
echo $html;
関数を配置する場所がわからなかったため、次のコードを直接コードに追加しました。
$html->load($html->save());
基本的に、forループで行われた変更を上記のhtmlにロックします。
想定されるソリューションは非常に高価であり、大きなループやその他の種類の繰り返しでは実際には使用できません。
「ソフト削除」を使用したい:
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
}
}
}
これは私のために働いています:
foreach($html->find('element') as $element){
$element = NULL;
}
removeNode
を削除するためのより良い方法であるため、新しい回答を追加します。
$html->removeNode('img');
このメソッドは、受け入れられた回答にマークが付けられたときにおそらく利用できませんでした。それぞれを見つけるためにhtmlをループする必要はありません、これはそれらを削除します。