【问题标题】:Use DOMDocument to replace text with href link使用 DOMDocument 将文本替换为 href 链接
【发布时间】:2017-06-09 12:15:00
【问题描述】:

我尝试使用this解决一个问题:我想用这种方式用文本链接替换文本。

但是如果我使用这个源代码:

$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'));

文本被替换,但&lt;a href='http://test.de&gt;test&lt;/a&gt; 打印为纯文本,而不是链接。

我该如何解决这个问题?

【问题讨论】:

    标签: php dom


    【解决方案1】:

    正如我所见,' 放错了位置,

    <a href='http://test.de>test</a>'
    

    这不是你应该想要的, 用这个替换它,

    <a href='http://test.de'>test</a>
    

    正如我所看到的Link,您可以在最后一行代码中使用preg_replace() 而不是preg_replace_dom()

    希望这会有所帮助。

    【讨论】:

    • 您好 Nirav,我已修复它,但内容仍显示为纯文本。
    【解决方案2】:

    这并不像我希望的那样干净,但我得到了它的工作。我知道这是一个老问题,但答案仍然相关。您需要将 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);
                }
            }
        }   
    

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 2011-04-28
      • 2011-09-12
      • 2023-01-12
      • 2023-01-12
      • 2013-12-13
      • 1970-01-01
      • 2017-07-31
      • 2011-05-01
      相关资源
      最近更新 更多