使用 DomDocument 将 <a> 标记替换为文本

Using DomDocument to Replace an <a> tag with Text

提问人:TheBigK 提问时间:1/12/2023 更新时间:1/12/2023 访问量:52

问:

我想用一些文本替换字符串中的标签。我的代码如下<a>

$string = 'This link <a href="somedomain.com">Some Domain</a> needs to be removed';

        $domdocument = new \DOMDocument();
        $domdocument->loadHTML($string, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
        $link = $domdocument->getElementsByTagName('a')[0];

        $replacement_link = $domdocument->createTextNode("HELLO WORLD");
        $domdocument->appendChild($replacement_link);
        $domdocument->replaceChild($link, $replacement_link);
        $output = $domdocument->saveHTML();
        dd($output);

// Expected output: 'This link HELLO WORLD needs to be removed'

但是,我得到背面作为输出,没有任何替换。我哪里出错了?$string

php dom文档

评论


答:

1赞 Jack Fleeting 1/12/2023 #1

可能还有其他方法可以做到这一点,但请尝试以下操作:

假设您的字符串嵌入在以下标记中:

$string = '<p>This link <a href="somedomain.com">Some Domain</a> needs to be removed</p>';

将代码更改为:

$domdocument = new \DOMDocument();
$domdocument->loadHTML($string, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED);
$link = $domdocument->getElementsByTagName('a')[0];

#new part:
$linkParent = $domdocument->getElementsByTagName('p')[0];
$link->textContent = "HELLO WORLD";
$linkParent->textContent = $linkParent->nodeValue;
$output = $domdocument->saveHTML();
echo($output);

输出应为:

<p>This link HELLO WORLD needs to be removed</p>

评论

0赞 TheBigK 1/12/2023
这按预期工作。但是想不通我们为什么需要?另外,您能指出为什么我的代码不起作用吗?试图让我的大脑了解 domDocument 如何工作的逻辑流程。$linkParent
0赞 Jack Fleeting 1/12/2023
@TheBigK 您的代码有两个问题 - 首先,将子元素附加到文档根元素,而不是节点所在的元素(在我的回答中是)。附加后,成为父母的兄弟姐妹,而不是孩子,因此您的后续不起作用。此外,的语法是 ;你的是相反的。如果你解决了这两个问题,它应该可以工作,或者你可以使用我回答中的快捷方式......$domdocument->appendChild($replacement_link);<a><p>$replacement_link<a>replaceChild()replaceChild()replaceChild(new, old)replaceChild($link, $replacement_link)
0赞 Ilia Yatsenko 1/12/2023 #2

在替换之前,似乎不应将替换节点附加到文档中。根据 docs: 此函数将子节点替换为传递的新节点。如果节点已经是子节点,则不会再次添加该节点。如果替换成功,则返回旧节点。

相反,应将其导入到文档中。尝试替换此行

$domdocument->appendChild($replacement_link);

有了这个

$domdocument->importNode($replacement_link, true);

(根据这个例子 https://www.php.net/manual/en/domnode.replacechild.php#48485)

评论

0赞 TheBigK 1/12/2023
只需替换该行就会抛出“DOMException Not Found Error”。通读您分享的链接。