首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOMElement替换HTML

DOMElement替换HTML
EN

Stack Overflow用户
提问于 2016-06-22 09:48:09
回答 2查看 1.6K关注 0票数 1

DOMElement中有这个HTML

代码语言:javascript
复制
<h1>Home</h1>
test{{test}}

我想用这样的方式来替换这个内容

代码语言:javascript
复制
<h1>Home</h1>
test

残存(所以我想删除{{test}})。

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

代码语言:javascript
复制
$node->nodeValue = preg_replace(
    '/(?<replaceable>{{([a-z0-9_]+)}})/mi', '' , $node->nodeValue);

这不起作用,因为nodeValue不包含节点的HTML。除了使用$node->C14N()之外,我不知道如何获取节点的HTML,但是通过使用C14N,我无法替换内容。有什么想法吗?我怎样才能在这样的HTML中删除{{test}}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-22 10:08:31

你试过DOMDocument::saveXML函数了吗?(http://php.net/manual/en/domdocument.savexml.php)

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

因此,例如:

代码语言:javascript
复制
<?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);

?>

这将给你:

代码语言:javascript
复制
<body>
  <h1>Home</h1>
  test{{test}}
</body>

如果不需要<body>标记,则可以循环遍历它的所有子节点:

代码语言:javascript
复制
<?php

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

?>

这将给你:

代码语言:javascript
复制
<h1>Home</h1>test{{test}}

编辑:当然,您可以用已经使用的regex替换{{test}}

代码语言:javascript
复制
<?php

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

?>

这将给你:

代码语言:javascript
复制
<h1>Home</h1>test

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

票数 1
EN

Stack Overflow用户

发布于 2016-06-22 10:47:24

问题主要是如何导航DOM,但RegExp也存在一个问题;实际上,在DOM操作方面,XPath提供了很大的灵活性,所以这是我最喜欢的解决方案。

假设您有一个像这样构建的DOMDocument (我附加了一个XPath):

代码语言:javascript
复制
$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);

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

因此,要在不破坏节点其余部分的情况下替换该文本节点中的{{test}},您可以这样做:

代码语言:javascript
复制
$xpath->query('/div/text()')->item(0)->nodeValue = preg_replace(
        '/(.*){{[^}]+}}/m', 
        '$1',
        $xpath->query('/div/text()')->item(0)->nodeValue
);

有些复杂,但是来自$dom->saveXML();的输出是:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<div><h1>Home</h1>test</div>

{{test}}已经被移除,剩下的就完好无损了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37964378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档