removeNode не работает правильно

0

Я хочу удалить все теги привязки, которые начинаются с '/'. это мой код:

$html = <<<HTML
<ul>
  <li><a href="/foo/bar1">link1</li>
  <li><a href="/foo/bar2">link2</li>
  <li><a href="/foo/bar3">link3</li>
</ul>
HTML;

$dom = new DOMDocument;
@$dom->loadHTML($html);
$tags = $dom->getElementsByTagName('a');
echo 'removed nodes:<br />';
foreach ($tags as $tag)
{
    $href = $tag->getAttribute('href');
    if($href[0] == '/')
    {
        echo $tag->nodeValue.'<br />';
        $tag->parentNode->removeChild($tag);
    }
}
echo 'remined content:<br />';
echo $dom->saveXML($dom);

но проблема в том, что это напоминает некоторые из них.

removed nodes:<br>
link1<br>
link3<br>

remined content:<br>
<ul><li>
  </li><li><a href="/foo/bar2">link2</a></li>
  <li>
</li></ul>

любая идея о том, как это сделать? Благодарю.

Теги:
domdocument

1 ответ

1
Лучший ответ

Вы не можете удалить DOMNodes из DOMNodeList, поскольку вы выполняете над ними цикл в цикле foreach (http://php.net/manual/en/domnode.removechild.php#90292). Хотя, кажется, работает очередь предметов для удаления:

<?php
$html = <<<HTML
<ul>
  <li><a href="/foo/bar1">link1</a></li>
  <li><a href="/foo/bar2">link2</a></li>
  <li><a href="/foo/bar3">link3</a></li>
</ul>
HTML;

$dom = new DOMDocument;
@$dom->loadHTML($html);


$domNodeList = $dom->getElementsByTagName('a'); 
$domElemsToRemove = array(); 
foreach ($domNodeList as $domElement ) { 
  $domElemsToRemove[] = $domElement; 
} 
echo 'removed nodes:<br />';
foreach ($domElemsToRemove as $tag)
{
    $href = $tag->getAttribute('href');
    if($href[0] == '/')
    {
        echo $tag->nodeValue.'<br />';
        $tag->parentNode->removeChild($tag);
    }
}
echo 'remined content:<br />';
echo $dom->saveXML($dom);

РЕДАКТИРОВАТЬ

также вы забыли тег close <a>

  • 0
    Да, это работает. на самом деле я видел эту страницу, но я думал, что другой цикл является избыточным!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню