#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>
Обратите внимание, что вам не нужно добавлять $div1_1
к HTML, replaceChild
это сделает за вас.