php dom removeChild ошибка проблема - PullRequest
3 голосов
/ 23 июля 2011

Я получаю сообщение об ошибке при попытке удалить узлы в xhtml.
Код:

foreach($post->getElementsByTagName('a') as $key=>$a)
{
    $post->removeChild($a);
}

Неустранимая ошибка: необработанное исключение «DOMException» с сообщением «Not Found» Ошибка 'в /var/www/content.php(24): content-> fetch () # 2 {main} в /var/www/content.php в строке 192

Если вместо этого я использую тег img, он удаляет все узлы img, кроме одного, и без фатальных ошибок. Что здесь происходит?

Ответы [ 5 ]

9 голосов
/ 23 июля 2011

попробуй:

$a->parentNode->removeChild($a);
5 голосов
/ 23 июля 2011

getElementsByTagName возвращает DOMNodeList.A DOMNodeList имеет позднюю привязку.Например, если вы измените документ, вы также измените список узлов.Итак, если вы планируете изменить документ, вы должны прочитать список узлов в массив, а затем вместо этого перебрать массив.Для операций чтения он будет работать точно как массив, поэтому здесь все будет в порядке.

Итак:

$nodes = array();
foreach ($post->getElementsByTagName('a') as $node) {
  $nodes[] = $node;
}
foreach ($nodes as $node) {
  $post->removeChild($node);
}
1 голос
/ 15 июня 2013

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

$nodes = $dom->getElementsByTagName('a')
for ($i = 0; $i < $nodes->length; $i++) {
                  $node = $nodes->item($i);
                  $node->parentNode->removeChild($node);
                  $i--;
                }

Или оператор while:

while($nodes->length) {
                  $node = $FlavorNodes->item(0);
                  $node->parentNode->removeChild($node);
                }
0 голосов
/ 24 апреля 2018
$nodes = $dom->getElementsByTagName('a'); // specify tag name you want to remove
$nodeToRemove = [];
foreach($nodes as $node) {
        $nodeToRemove[] = $node;
}
foreach ($nodeToRemove as $node) {
    $node->parentNode->removeChild($node);
}

Добавить отметку, если вы хотите удалить, если только пустые теги,

if (!$node->hasChildNodes() OR $node->nodeValue == '') 
{ 
  $nodeToRemove[] = $node; 
}
0 голосов
/ 23 июля 2011

Это на самом деле не решает вашу проблему, в которой я не слишком уверен, но похоже, что вы пытаетесь удалить HTML-теги из поста. Разве встроенная функция strip_tags() [ docs ] лучше подходит для этого?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...