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

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

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

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

помочь?

6 ответов


нет специальных методов для удаления элементов. Вы просто находите все элементы 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;
}