使用DOMdocument
和DOMnode
类可以在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>
答案 0 :(得分:0)
我花了一些时间寻找一种通用的方法。
线索是文本本身也由节点组成。默认情况下,在加载文档时,每个连续的文本块都会替换为表示它的单个“文本节点”。因此,示例HTML包含三个节点;
要替换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();