PHP DOMElement::replaceChild выдает фатальную ошибку

#php #domdocument

#php #domdocument

Вопрос:

Исходный HTML (test.html ) является:

 <html lang="ru">
  <head>
  <meta charset="UTF-8">
    <title>PHP Test</title>
  </head>
  <body>
    <h1>Test page</h1>
    <div>
        <div id="to-replace-1">Test content 1</div>
    </div>
  </body>
</html>
 

PHP для изменения этого HTML:

 <?php 
$str = file_get_contents('test.html');
$doc = new DOMDocument();
@$doc->loadHTML($str);

$div1 = $doc->getElementById('to-replace-1');
echo $div1->nodeValue;  // Success - 'Test content 1'
$div1_1 = $doc->createElement('div');
$div1_1->nodeValue = 'Content replaced 1';
$doc->appendChild($div1_1);
$doc->replaceChild($div1_1, $div1); 
 

Не имеет значения — добавьте вновь созданный $ div1_1 в $ doc или нет. Результат тот же — последняя строка выдает «PHP Fatal error: Uncaught DOMException: ошибка не найдена в …».

Что не так?

Ответ №1:

Ваша проблема в том, что $doc у него нет дочернего элемента, который есть $div1 . Вместо этого вам нужно заменить дочерний элемент $div1 родительского элемента, к которому вы можете получить доступ через его parentNode свойство:

 $doc = new DOMDocument();
$doc->loadHTML($str, LIBXML_HTML_NODEFDTD);

$div1_1 = $doc->createElement('div');
$div1_1->nodeValue = 'Content replaced 1';

$div1 = $doc->getElementById('to-replace-1');
$div1->parentNode->replaceChild($div1_1, $div1); 
echo $doc->saveHTML();
 

Вывод:

 <html lang="ru">
  <head>
  <meta charset="UTF-8">
    <title>PHP Test</title>
  </head>
  <body>
    <h1>Test page</h1>
    <div>
        <div>Content replaced 1</div>
    </div>
  </body>
</html>
 

Демонстрация на 3v4l.org

Обратите внимание, что вам не нужно добавлять $div1_1 к HTML, replaceChild это сделает за вас.