【问题标题】:How to insert new element after specific element in html using php?如何使用php在html中的特定元素之后插入新元素?
【发布时间】:2023-03-18 08:35:01
【问题描述】:

我真的很难理解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 是普通的吗?你在用jquery之类的js库吗?
  • 方向是“如何使用DomDocument”吗?正确的方向是尝试。如果您尝试失败,请将错误代码返回给我们,让我们看看您误入歧途的地方。

标签: php html html-parsing domdocument


【解决方案1】:

您需要使用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();

【讨论】:

  • 如何在创建元素中添加标签属性
  • @mehul 使用setAttribute() 方法。检查this
【解决方案2】:

作为@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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多