Простой HTML Dom: Как удалить элементы?
Я хотел бы использовать простой HTML DOM для удаления всех изображений в статье, чтобы я мог легко создать небольшой фрагмент текста для новостного тикера, но я не понял, как удалить элементы с ним.
в основном я бы сделал
- получить содержимое в виде строки HTML
- удалить все теги изображений из содержимого
- ограничить содержание до x слов
- выход.
помочь?
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
}
}
}