如何在html中插入特定元素后的新元素


How to insert new element after specific element in html using php?

我真的很难理解DOMDocument解析。我正在尝试解决以下问题。给定以下HTML

<h1>Title</h1>
<p>Some Content</p>
<p>Some More Content</p>
<p>Other Content</p>
<p>Last Bit of Content</p>

我想在第二个段落标签之后添加一个div。本质上,结果需要像下面这样

<h1>Title</h1>
<p>Some Content</p>
<p>Some More Content</p>
<div>Something different</div> <!-- new tag -->
<p>Other Content</p>
<p>Last Bit of Content</p>

看了这里的一些帖子,我现在已经厌倦了抓耳挠脑。

您需要使用DOMDocument类将字符串解析为html。解析html后,选择第三个p元素,并使用DOMNode::insertBefore在其后面插入新元素。

$doc = new DOMDocument();
$doc->loadHTML($html);
// find 3th p tag
$p = $doc->getElementsByTagName("p")->item(2);
// create new div tag
$div = $doc->createElement("div", "Something different"); 
// insert created element after 3th p
$p->parentNode->insertBefore($div, $p); 
$html = $doc->saveHTML();

作为@Mohammad answer的补充(这是完全正确的),如果您想精确地找到h1标记之后的第二个p标记,并且在同一级别,您可以使用XPath查询//h1/following-sibling::p[2]。例子:

$html = <<<'EOD'
<h1>Title</h1>
<p>Some Content</p>
<p>Some More Content</p>
<p>Other Content</p>
<p>Last Bit of Content</p>
EOD;
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTML('<div>' . $html . '</div>', LIBXML_HTML_NOIMPLIED);
libxml_clear_errors();
$xp = new DOMXPath($dom);
$targetNode = $xp->query('//h1/following-sibling::p[2]');
if ($targetNode->length) {
    $targetNode = $targetNode->item(0);
    $newNode = $dom->createElement('div', 'something different');
    $targetNode->parentNode->insertBefore($newNode, $targetNode->nextSibling);
    $targetNode->parentNode->insertBefore($dom->createTextNode("'n"), $targetNode->nextSibling);
}
$result = '';
foreach ($dom->documentElement->childNodes as $childNode) {
    $result .= $dom->saveHTML($childNode);
}
echo $result;