我想使用简单的 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;
}
添加新答案,因为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();
}