проблема в удалении мета-тега с помощью php DOM api - PullRequest
1 голос
/ 21 апреля 2011
$html = new DOMDocument();
           $html->loadHTMLFile($filename);

           $meta = $html->getElementsByTagName("meta");


           foreach($meta as $oldmeta_tags)
           {

               $parent = $oldmeta_tags->parentNode;
               $parent->removeChild($oldmeta_tags);

           }
         echo "<br>Number of bytes stored = ".$html->saveHTMLFile($filename);
           $result[] = file_get_contents($filename);

Некоторые из метатегов удалены, а некоторые нет. пожалуйста помогите что я делаю не так

Ответы [ 2 ]

4 голосов
/ 21 апреля 2011

Когда вы используете foreach для итерации по DOMNodeList и удаления элемента, вы изменяете содержимое DOMNodeList, поэтому узлы будут пропущены.Вы должны повторить в обратном направлении:

$nodes = $dom->getElementsByTagName('meta');
for ($i = $nodes->length - 1; $i >= 0; $i--) {
    $nodes->item($i)->parentNode->removeChild($nodes->item($i));
}
0 голосов
/ 21 апреля 2011

Вы перебираете массив и одновременно удаляете его.

К сожалению, это означает, что каждый раз, когда вы удаляете дочерний элемент внутри цикла, следующая итерация цикла пропускает узел.foreach недостаточно «умен» в сочетании с DOMDocument, чтобы сделать это разумно.

Вместо foreach используйте индексы:

$meta = $html->getElementsByTagName("meta");
for ($i = $meta->length - 1; $i >= 0; $i--) { // `foreach` breaks the `removeChild`
   $child = $meta->item($i);
   $child->parentNode->removeChild($child);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...