繁体   English   中英

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

[英]Simple HTML Dom: How to remove elements?

我想使用简单的 HTML DOM 来删除文章中的所有图像,这样我就可以轻松地为新闻代码创建一小段文本,但我还没有弄清楚如何使用它来删除元素。

基本上我会做

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

有什么帮助吗?

没有用于删除元素的专用方法。 您只需找到所有 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 来查找每一个,这将删除它们。

使用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

尝试这个:

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

这现在有效:

$element->remove();

您可以在此处查看该方法的文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM