39

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

基本的に私はするだろう

  1. コンテンツを HTML 文字列として取得する
  2. コンテンツからすべてのイメージ タグを削除する
  3. コンテンツを x 単語に制限する
  4. 出力。

何か助けはありますか?

4

9 に答える 9

54

要素を削除するための専用のメソッドはありません。すべての img 要素を見つけて実行するだけです

$e->outertext = '';
于 2011-11-22T13:29:26.030 に答える
30

外側のテキストのみを削除すると、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 クラス内に配置すれば、問題ありません。

于 2012-07-19T07:27:49.393 に答える
14

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

これを試して:

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

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

$html->save();

echo $html;
于 2015-01-14T12:57:17.967 に答える
5

関数をどこに置くべきかわからなかったので、コードに次のコードを直接入れました。

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

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

于 2013-04-02T00:45:11.473 に答える
2

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

「ソフト削除」を使用することを好みます。

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 
        }
    }

}
于 2016-06-16T15:50:51.927 に答える
1

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

foreach($html->find('element') as $element){
   $element = NULL;
}
于 2014-02-12T00:24:35.703 に答える
0

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.

于 2019-09-08T00:04:24.820 に答える
0

これを試して:

$dom = new Dom();
$dom->loadStr($text);
foreach ($dom->find('element') as $element) {
   $element->delete();
}
于 2022-02-18T14:43:15.060 に答える