Ответ 1
Не существует специальных методов удаления элементов. Вы просто найдете все элементы img, а затем выполните
$e->outertext = '';
Я хотел бы использовать Simple 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('element') as $element){
$element = NULL;
}
Предполагаемые решения довольно дороги и практически непригодны для использования в большой петле или другом повторении.
Я предпочитаю использовать "мягкие удаления":
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
}
}
}
Добавление нового ответа, поскольку removeNode
определенно является лучшим способом его удаления:
$html->removeNode('img');
Этот метод, вероятно, был недоступен, когда был отмечен принятый ответ. Вам не нужно зацикливаться на HTML, чтобы найти каждый из них, это удалит их.