繁体   English   中英

DOMElement替换HTML值

[英]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/zh/domdocument.savexml.php

它有第二个参数$node ,您可以用它指定要打印HTML / XML的节点。

因此,例如:

<?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也存在问题。 XPath实际上在DOM操作方面提供了很多灵活性,因此这是我的首选解决方案。

假设您有一个像这样构建的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();的输出$dom->saveXML(); 是:

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

{{test}}已被删除,其余部分保持不变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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