Простой HTML Dom: как удалить элементы? - PullRequest
36 голосов
/ 22 ноября 2011

Я хотел бы использовать Simple HTML DOM, чтобы удалить все изображения в статье, чтобы я мог легко создать небольшой фрагмент текста для новостной ленты, но я не понял, как удалить из нее элементы.

По сути, я бы сделал

  1. Получить содержимое в виде строки HTML
  2. Удалить все теги изображений из содержимого
  3. Ограничить содержимое x словами
  4. Вывод.

Любая помощь?

Ответы [ 6 ]

50 голосов
/ 22 ноября 2011

Не существует специальных методов удаления элементов.Вы просто находите все элементы img и затем делаете

$e->outertext = '';
28 голосов
/ 19 июля 2012

когда вы удаляете только внешний текст, вы удаляете само содержимое 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, и все хорошо.

12 голосов
/ 14 января 2015

Я думаю, у вас есть некоторые трудности, потому что вы забыли сохранить (сбросить внутреннее дерево DOM обратно в строку)

Попробуйте это:

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

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

$html->save();

echo $html;
4 голосов
/ 02 апреля 2013

Я не мог понять, куда поместить функцию, поэтому я просто вставил следующее прямо в мой код:

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

Он в основном блокирует изменения, сделанные в цикле for, обратно в html выше.

2 голосов
/ 16 июня 2016

Предполагаемые решения довольно дороги и практически непригодны для большого цикла или другого вида повторения.

Я предпочитаю использовать «мягкое удаление»:

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 голос
/ 12 февраля 2014

Это работает для меня:

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