Вопрос по php, simple-html-dom, dom – Простой HTML Dom: как удалить элементы?

36

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

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

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

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

Ваш Ответ

6   ответов
11

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

Попробуй это:

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

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

$html->save();

echo $html;
отлично работает для меня .... Rana Zubair
48

те все элементы img, а затем делаете

$e->outertext = '';
@ kasakka Я не понимаю. Ты толькоforeach в результате$html->find('img') и удалите внешний текст. И тогда вы делаетеecho $html; и должен получить HTML минус элементы img. Gordon
Как бы я сделал изменения, сохранив остальную часть содержимого HMTL, так как $ html-> find ('img') вернул бы только элементы изображения? kasakka
2

льшого цикла или другого вида повторения.

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

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

}
4

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

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

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

это было потрясающе! Mohsen
1

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

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

вы удаляете само содержимое 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, чтобы исключить один элемент. Это будет лучший, более эффективный способ. Abraham TS
Хорошее дополнение к библиотеке. Одна ошибка, однако, $ html не определен в классе, обычно это $ html = new simple_html_dom (), поэтому его необходимо заменить на $ this, как в "foreach ($ this-> find ($ selector) как $ node) ». Я отправил правку. marsbard

Похожие вопросы