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

添加新答案,因为removeNode绝对是删除它的更好方法:

$html->removeNode('img');

标记接受的答案时,此方法可能不可用。您不需要循环 html 来查找每一个,这将删除它们。

于 2019-09-08T00:04:24.820 回答
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
于 2021-03-06T22:13:41.490 回答
0

试试这个:

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