用文本替换DOM节点

时间:2016-04-25 08:22:42

标签: php html domdocument

使用DOMdocumentDOMnode类可以在PHP中解析和编辑HTML。在另一个问题中回答的是如何转向

<div>text <p>test</p> more text</div>

进入:

<div>text <a>test</a> more text</div>

或将其转换为(PHP DOMDocument question: how to replace text of a node?

<div>text <p>and</p> more text</div>

但是,如何将节点全部替换为文本,并将其转换为此?

<div>text and more text</div> 

1 个答案:

答案 0 :(得分:0)

我花了一些时间寻找一种通用的方法。

线索是文本本身也由节点组成。默认情况下,在加载文档时,每个连续的文本块都会替换为表示它的单个“文本节点”。因此,示例HTML包含三个节点;

  • 文本节点
  • a&lt; p&gt;节点(包含文本节点)
  • 另一个文字节点

要替换p节点,我们创建另一个文本节点。然后我们得到三个文本节点的列表。最后,要将它合并回一个文本节点(将新加载的文档与替换文件的格式相匹配),有一个函数'normalize',在编辑后递归地“清理”,删除虚假节点并合并相邻的文本节点。

$text = "<div>text <p>test</p> more text</div>";
$doc = \DOMDocument::loadHTML($text);
$node = $doc->getElementsByTagName("div")->item(0);
$child = $node->childNodes->item(1);
$newNode = $doc->createTextNode("and");
$node->replaceChild($newNode, $child);
$node->normalize();
// Check for correctness
echo $doc->saveHTML();