1

我有这个 HTML 字符串在DOMElement

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

我想以一种仅替换此内容的方式

<h1>Home</h1>
test

仍然存在(所以我想删除{{test}})。

此时,我的代码如下所示:

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

这不起作用,因为nodeValue不包含节点的 HTML 值。除了 using 之外,我不知道如何获取节点的 HTML 字符串$node->C14N(),但是通过 usingC14N我无法替换内容。任何想法如何删除这样{{test}}的 HTML 字符串?

4

2 回答 2

1

你试过这个DOMDocument::saveXML功能吗?( http://php.net/manual/en/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

注意:我没有测试过代码,但这应该会给你一个大致的想法。

于 2016-06-22T10:08:31.480 回答
1

问题主要在于您如何导航 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>针对该文本节点。'/div/text()'

{{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}}已被移除,其余部分完好无损。

于 2016-06-22T10:47:24.613 回答