提问人:TheBigK 提问时间:1/12/2023 更新时间:1/12/2023 访问量:52
使用 DomDocument 将 <a> 标记替换为文本
Using DomDocument to Replace an <a> tag with Text
问:
我想用一些文本替换字符串中的标签。我的代码如下<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
答:
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”。通读您分享的链接。
评论