[英]Use DOMDocument to replace text with href link
我试图用它来解决一个问题:我想用这种方式用文本链接替换文本。
但是如果我使用这个源代码:
$dom = new DOMDocument;
$dom->loadHTML($html_content);
function preg_replace_dom($regex, $replacement, DOMNode $dom, array $excludeParents = array()) {
if (!empty($dom->childNodes)) {
foreach ($dom->childNodes as $node) {
if ($node instanceof DOMText &&
!in_array($node->parentNode->nodeName, $excludeParents))
{
$node->nodeValue = preg_replace($regex, $replacement, $node->nodeValue);
}
else
{
preg_replace_dom($regex, $replacement, $node, $excludeParents);
}
}
}
}
preg_replace_dom('/match this text/i', "<a href='http://test.de'>test</a>", $dom->documentElement, array('a'));
文本被替换,但<a href='http://test.de>test</a>
打印为纯文本,而不是链接。
我该如何解决这个问题?
正如我所看到的'
放错了位置,
<a href='http://test.de>test</a>'
这不是你应该想要的,用这个替换它,
<a href='http://test.de'>test</a>
正如我所看到的那样Link ,您可以在最后一行代码中使用preg_replace()
而不是preg_replace_dom()
。
希望这可以帮助。
这并不像我希望的那样干净,但我让它工作了。 我现在知道这是一个老问题,但答案仍然相关。 您需要将 dom 文档传递到该方法中,因为您必须创建一个新的 HTML 节点来替换旧的节点。 你不能只用 HTML 替换文本,你必须用新的 HTML 节点替换 HTML 节点。 很想听听有关如何改进的任何建议
private function _preg_replace_dom($regex, $domDocument, $replacement, DOMNode $dom, array $excludeParents = array()) {
if (!empty($dom->childNodes)) {
$replacementNodes = array();
foreach ($dom->childNodes as $node) {
if ($node instanceof DOMText && !in_array($node->parentNode->nodeName, $excludeParents))
{
//$node->nodeValue = preg_replace($regex, $replacement, $node->nodeValue);
$replacementHtml = preg_replace($regex, $replacement, $node->nodeValue);
$linkReplacement = $domDocument->createDocumentFragment();
$linkReplacement->appendXML($replacementHtml);
$tmpreplacement = new stdClass();
$tmpreplacement->oldNode = $node;
$tmpreplacement->newNode = $linkReplacement;
$replacementNodes[] = $tmpreplacement;
}
else
{
$this->_preg_replace_dom($regex, $domDocument, $replacement, $node, $excludeParents);
}
}
foreach($replacementNodes as $replacement)
{
$dom->replaceChild($replacement->newNode, $replacement->oldNode);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.