Удалить элемент HTML из разобранного документа HTML по условию - PullRequest
3 голосов
/ 11 марта 2012

Я проанализировал HTML-документ с помощью Simple PHP HTML DOM Parser.В разобранном документе есть ul-тег с некоторыми li-тегами.Один из этих li-тегов содержит одну из тех страшных кнопок «Добавить», которые я хочу удалить.

Что еще хуже, элемент списка не имеет ни класса, ни идентификатора, и он не всегда совпадаетпозиция в списке.Так что нет простого способа (поправьте меня, если я ошибаюсь) удалить его с помощью парсера.

Что я хочу сделать, так это искать строку «addthis.com» во всех li-элементах иУдалите все элементы, которые содержат эту строку.

<ul>
    <li>Foobar</li>
    <li>addthis.com</li><!-- How do I remove this? -->
    <li>Foobar</li>
</ul>

К вашему сведению: это мой хобби проект Пурли, посвященный изучению PHP, а не случай кражи контента с целью получения прибыли.добро пожаловать!

Ответы [ 3 ]

3 голосов
/ 11 марта 2012

Не удалось найти метод для явного удаления узлов, но его можно удалить, установив пустой для externaltext.

$html = new simple_html_dom();
$html->load(file_get_contents("test.html"), false, false); // preserve formatting

foreach($html->find('ul li') as $element) {
  if (count($element->find('a.addthis_button')) > 0) {
    $element->outertext="";
  }
}

echo $html;
1 голос
/ 11 марта 2012

Ну, что вы можете сделать, это использовать jQuery после разбора. Примерно так:

$('li').each(function(i) {
    if($(this).html() == "addthis.com"){
        $(this).remove();
    }
});
0 голосов
/ 21 июля 2013

В этом решении используется класс DOMDocument и domnode.removechild метод:

$str="<ul><li>Foobar</li><li>addthis.com</li><li>Foobar</li></ul>";
$remove='addthis.com';
$doc = new DOMDocument();
$doc->loadHTML($str);
$elements = $doc->getElementsByTagName('li');
$domElemsToRemove = array();
foreach ($elements as $element) {
  $pos = strpos($element->textContent, $remove); // or similar $element->nodeValue
  if ($pos !== false) {
    $domElemsToRemove[] = $element;
  }
}
foreach( $domElemsToRemove as $domElement ){
  $domElement->parentNode->removeChild($domElement);
}
$str = $doc->saveHTML(); // <ul><li>Foobar</li><li>Foobar</li></ul>
...