DOMElement replace HTML value



我在 DOMElement中有此HTML字符串:

<h1>Home</h1>
test{{test}}

我想以仅

的方式替换此内容
<h1>Home</h1>
test

仍然保留(我想删除{{test}})。

此刻,我的代码看起来像这样:

$node->nodeValue = preg_replace(
    '/(?<replaceable>{{([a-z0-9_]+)}})/mi', '' , $node->nodeValue);

这不起作用,因为nodeValue不包含节点的HTML值。除使用$node->C14N()外,我不知道如何获得节点的HTML字符串,但是使用C14N,我无法替换内容。有什么想法我可以在这样的HTML字符串中删除{{test}}

您是否尝试过DOMDocument::saveXML函数?(http://php.net/manual/en/domdocument.savexml.php)

它具有第二个参数 $node

所以,例如:

<?php
$doc = new DOMDocument('1.0');
// we want a nice output
$doc->formatOutput = true;
$root = $doc->createElement('body');
$root = $doc->appendChild($root);
$title = $doc->createElement('h1', 'Home');
$root->appendChild($title);
$text = $doc->createTextNode('test{{test}}');
$text = $root->appendChild($text);
echo $doc->saveXML($root);
?>

这将为您提供:

<body>
  <h1>Home</h1>
  test{{test}}
</body>

如果您不想要<body>标签,则可以循环浏览其所有童话:

<?php
foreach($root->childNodes as $child){    
    echo $doc->saveXML($child);
}
?>

这将为您提供:

<h1>Home</h1>test{{test}}

编辑:然后,您当然可以由已使用的正则替换{{test}}

<?php
$xml = '';
foreach($root->childNodes as $child){    
    $xml .= preg_replace(
                '/(?<replaceable>{{([a-z0-9_]+)}})/mi', '', 
                $doc->saveXML($child)
    );
}
?>

这将为您提供:

<h1>Home</h1>test

注意:我尚未测试代码,但这应该给您一般的想法。

问题主要围绕着您如何浏览DOM,但是您的Regexp也存在问题;当涉及到DOM操作时,XPath实际上提供了很大的灵活性,因此这是我的首选解决方案。

假设您有这样的domdocument(我已经附加了一个XPath):

$dom = new DOMDocument('1.0', 'utf-8');
$xpath = new DOMXPath($dom);
$node = $dom->createElement('div');
$node->appendChild(
    $dom->createElement('h1', "Home")
    );
$node->appendChild(
    $dom->createTextNode("test{{test}}")
    );
$dom->appendChild($node);

您可以在XPath中使用'/div/text()'专门针对该<div>的文本节点。

因此,要替换该文本节点中的{{test}}而不损坏节点的其余部分,您将要做:

$xpath->query('/div/text()')->item(0)->nodeValue = preg_replace(
        '/(.*){{[^}]+}}/m', 
        '$1',
        $xpath->query('/div/text()')->item(0)->nodeValue
);

有些令人费解,但$dom->saveXML();的输出为:

<?xml version="1.0" encoding="utf-8"?>
<div><h1>Home</h1>test</div>

{{test}}已被删除,其余完整。

最新更新