Я только что создал новый ОБЪЕКТ DOM XPATH.
И после пары операций я сохранил свой результат на SaveHtml.
$String[] = $dom->saveHTML();
А затем я просто помещаю содержимое в файл.
file_put_contents($filename, $string);
Структура Html примерно такая.
<div if = "rand11">
</div>
<div if = "rand24">
</div>
<div if = "rand51">
</div>
Есть несколько методов для создания новых div. Вы можете использовать ->createElement. Кроме того, вы можете разместить этот новый элемент с помощью ->parentNode->insertBefore, но невозможно создать контейнерный div, как здесь.
<div if = "container-div">
<div if = "rand11">
</div>
<div if = "rand24">
</div>
<div if = "rand51">
</div> </div>
Я пробовал несколько способов сделать это, но безуспешно.
Итак, у меня есть пара вопросов:
1. Можно ли создать контейнер Div напрямую, изменяя Dom?
2. Можно ли добавить новый элемент Html в массив, содержащий данные $dom->saveHTML();?






Конечно да. Большинство из них фактически использует одни и те же методы. Например, appendChild()/insertBefore() не просто используются для новых узлов, они могут перемещать существующие узлы.
$html = <<<'HTML'
<div if = "rand11"></div>
<div if = "rand24"></div>
<div if = "rand51"></div>
HTML;
$document = new DOMDocument();
$document->loadHTML($html);
$xpath = new DOMXpath($document);
// fetch the nodes that should be put inside the container
$nodes = $xpath->evaluate('//div[starts-with(@if, "rand")]');
// validate that here is at least one node
if ($first = $nodes[0]) {
// create the container and insert it before the first
$container = $first->parentNode->insertBefore(
$document->createElement('div'), $first
);
$container->setAttribute('class', 'container-div');
// move all the fetched nodes into the container
foreach($nodes as $node) {
$container->appendChild($node);
}
// output formatted
$document->formatOutput = TRUE;
echo $document->saveHTML($container);
}
Выход:
<div class = "container-div">
<div if = "rand11"></div>
<div if = "rand24"></div>
<div if = "rand51"></div>
</div>