Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

$e->outertext = '';

Ответ 2

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

Ответ 3

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

Попробуйте следующее:

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

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

$html->save();

echo $html;

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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 
        }
    }

}

Ответ 7

Добавление нового ответа, поскольку removeNode определенно является лучшим способом его удаления:

$html->removeNode('img');

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