Я только что создал новый объект 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>
Других решений пока нет …