シンプルな HTML DOM を使用して記事内のすべての画像を削除したいので、ニュース ティッカー用の小さなテキスト スニペットを簡単に作成できますが、要素を削除する方法がわかりません。
基本的に私はするだろう
- コンテンツを HTML 文字列として取得する
- コンテンツからすべてのイメージ タグを削除する
- コンテンツを x 単語に制限する
- 出力。
何か助けはありますか?
シンプルな 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;
}
Adding new answer since removeNode
is definitely a better way of removing it:
$html->removeNode('img');
This method probably was not available when accepted answer was marked. You do not need to loop the html to find each one, this will remove them.
これを試して:
$dom = new Dom();
$dom->loadStr($text);
foreach ($dom->find('element') as $element) {
$element->delete();
}