简单 HTML Dom:如何删除元素?

38

我想使用Simple HTML DOM来移除文章中的所有图片,以便轻松创建新闻滚动条的小段落,但我还没弄清如何使用它来删除元素。

基本上,我需要:

  1. 获取HTML字符串作为内容。
  2. 从内容中删除所有图像标签。
  3. 将内容限制为x个单词。
  4. 输出结果。

有什么帮助吗?

11个回答

55

没有专门删除元素的方法。您只需找到所有的img元素,然后执行以下操作:

$e->outertext = '';

我该如何在保留HTML内容的同时进行更改,因为$html->find('img')只会返回图像元素? - kasakka
1
@kasakka 我不明白。你只需在 $html->find('img') 的结果上使用 foreach 并删除 outerText。然后你执行 echo $html;,应该会得到减去 img 元素的 HTML。 - Gordon

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 类里就可以了。


3
图书馆的好补充。不过有一个错误,类中没有定义$html,通常是$html = new simple_html_dom(),因此需要用$this替换,就像“foreach ($this->find($selector) as $node)”一样。我已经提交了编辑。 - marsbard
这样做非常低效,重新加载整个DOM只是为了消除一个元素。应该有更好、更高效的方法。 - Abraham Toledo

14

我认为你遇到了一些困难,因为你忘记保存(将内部DOM树转换回字符串)。

尝试这个:

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

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

$html->save();

echo $html;

5

我不知道该把这个函数放在哪里,所以我直接把以下内容放在了我的代码中:

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

基本上,它会将在for循环中进行的更改锁定到上述HTML中。

太棒了! - Mohsen

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

}

1
这对我来说有效:

这是适用于我的情况:

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

不要忘记 $html->save(); - Salem

0

现在这个有效:

$element->remove();

你可以在这里查看方法的文档这里

0
使用 outerhtml 代替 outertext
<div id='your_div'>the contents of your div</div>

$your_div->outertext = '';
echo $your_div // echoes <div id='your_div'></div>

$your_div->outerhtml= '';
echo $your_div // echoes nothing

0

试试这个:

$dom = new Dom();
$dom->loadStr($text);
foreach ($dom->find('element') as $element) {
   $element->delete();
}

0

以下我使用FIND()函数的两种不同方法,删除传入URL的HEADER和所有SCRIPT节点。删除第二个参数以返回所有匹配节点的数组,然后只需循环遍历这些节点。

$clean_html = file_get_html($url);
 
// Find and remove 1st instance of node.   
$node = $clean_html->find('header', 0);
$node->remove();       

// Find and remove all instances of Nde.
$nodes = $clean_html->find('script');
foreach($nodes as $node) {
    $node->remove();       
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接