用domdocument编辑html文本

时间:2013-06-17 19:52:43

标签: php domdocument

给出部分HTML片段,例如

<div id="article">
    <p>Some text</p>
    <p>More text</p>
    <pre><code>
         echo $variable;
    </code></pre>
</div>

我想循环遍历文本节点并向它们应用函数,这对函数的作用并不重要,但是如果它是预编码块中的文本则不然。

鉴于它是部分代码块,我认为我需要使用DOMDocument->createDocumentFragment()。但是,如何在没有创建额外<html>标记的情况下循环文本节点然后保存输出,因为saveHTML()似乎默认情况下会这样做?

2 个答案:

答案 0 :(得分:1)

您可以使用文档片段。循环文本节点是很容易的部分,找到它们是一个小问题。为此,下面的示例使用XPath查询来查找不是<pre>元素后代的所有文本节点。

$doc = new DOMDocument;
$xpath = new DOMXPath($doc);

$frag = $doc->createDocumentFragment();
$frag->appendXML(<<<'HTML'
<div id="article">
    <p>Some text</p>
    <p>More text</p>
    <pre><code>
         echo $variable;
    </code></pre>
</div>
HTML
);

$text_nodes = $xpath->query('descendant::text()[not(ancestor::pre)]', $frag);
foreach ($text_nodes as $text_node) {
    $text_node->data = strrev($text_node->data);
}

// Print the div
echo $doc->saveHTML($frag->firstChild);

这将打印出如下内容:

<div id="article">    
<p>txet emoS</p>    
<p>txet eroM</p>    
<pre><code>
         echo $variable;
    </code></pre>
</div>

有用的链接:

答案 1 :(得分:0)

你为什么使用DomDocument?

为什么不从'远程源'读取HTML,然后使用file_put_contents()将其保存为服务器上的文件

http://php.net/manual/en/function.file-put-contents.php