如何使用php在html中的特定元素后插入新元素?

时间:2016-10-11 18:38:13

标签: php html html-parsing domdocument

我真的很难理解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>

看了几篇文章,我现在感到无聊,现在已经摸不着头脑了。

2 个答案:

答案 0 :(得分:5)

您需要使用DOMDocument类将字符串解析为html。解析html后,选择第三个Dictionary<String, List<String>> MyData = new Dictionary<String, List<String>>(); 元素并使用DOMNode::insertBefore在其后插入新元素。

p

答案 1 :(得分:0)

作为@Mohammad答案的补充(这是完全正确的),如果您想要在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;