给出部分HTML片段,例如
<div id="article">
<p>Some text</p>
<p>More text</p>
<pre><code>
echo $variable;
</code></pre>
</div>
我想循环遍历文本节点并向它们应用函数,这对函数的作用并不重要,但是如果它是预编码块中的文本则不然。
鉴于它是部分代码块,我认为我需要使用DOMDocument->createDocumentFragment()
。但是,如何在没有创建额外<html>
标记的情况下循环文本节点然后保存输出,因为saveHTML()
似乎默认情况下会这样做?
答案 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>
有用的链接:
DOMText
data
property(DOMText
扩展`DOMCharacterData)答案 1 :(得分:0)
你为什么使用DomDocument?
为什么不从'远程源'读取HTML,然后使用file_put_contents()将其保存为服务器上的文件