Простой HTML-дом: как удалить элементы?

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

В основном я бы сделал

  1. Получить контент в виде строки HTML
  2. Удалить все теги изображений из контента
  3. Ограничить содержание х словами
  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; }