Удалить тег <a>, но не содержимое - PullRequest
1 голос
/ 02 июля 2019

Я пытаюсь получить все ссылки со страницы и удалить их, кроме содержимого этих ссылок.Код не работает на 100%, потому что некоторые линии удалены, а другие нет.

Я использую PHP и DOMDocument.

   $dom = new DOMDocument();
   $dom->encoding = 'utf-8';
   $dom->loadHTML(utf8_decode($text));

   $links = $dom->getELementsByTagName('a');

   foreach($links as $link)
   {
       $link->parentNode->replaceChild(new DOMText($link->textContent), $link);//I've tried this way but not work.

       //And I've tried other way below:
       /*$sibling = $link->firstChild;
       do {
          $next = $sibling->nextSibling;
          $link->parentNode->insertBefore($sibling, $link);
       } while ($sibling = $next);
       $link->parentNode->removeChild($link);*/
   }
   return $dom->saveHTML();

Например, у нас есть три ссылки:

<p>Page</p>
<a href="http://domain/page/pag.php?id_pag=1481">Page1</a>
<a href="http://domain/page/pag.php?id_pag=1482">Page2</a>
<a href="http://domain/page/pag.php?id_pag=1483">Page3</a>
<p>Test</p>

Результат:

<p>Page</p>
Page1
<a href="http://domain/page/pag.php?id_pag=1482">Page2</a>
Page3
<p>Test</p>

Я хочу удалить все ссылки (не контент).Любая идея, чтобы решить эту проблему?

1 Ответ

1 голос
/ 02 июля 2019

Сделайте копию $links в виде обычного массива, потому что объект, который возвращает getElementsByTagName(), является «живым» NodeList - он изменяется при изменении DOM, и это приводит к тому, что цикл foreach пропустить элементы (это та же проблема, что и попытка удалить элементы из массива, пока вы зацикливаетесь на нем).

$links_array = [];
foreach ($links as $l) {
    $links_array[] = $l;
}
foreach($links_array as $link)
{
   $link->parentNode->replaceChild(new DOMText($link->textContent), $link);
}
...