繁体   English   中英

使用 DOMDocument 用 href 链接替换文本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM