使用DOMDocument用href链接替换文本

时间:2017-06-09 12:15:00

标签: php dom

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

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

#plt.figure('Single Plot',figsize=(20,5))
plt.xlabel('time')
plt.ylabel('speed')
plt.title('speed at timepoint t')
plt.grid(True)
for i in arr:
    #plt.figure('Single Plot',figsize=(20,5))
    plt.plot(i)

文本被替换,但$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')); 打印为纯文本,而不是链接。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

我可以看到'放错地方了,

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

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

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

正如我看到的那样Link,您可以在最后一行代码中使用preg_replace()代替preg_replace_dom()

希望这有帮助。

答案 1 :(得分:0)

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