PHP DOMDocument如何将HTML作为元素追加而非文本?
解决PHP DOMDocument追加HTML内容被解析为文本的问题
你遇到的问题根源在于:DOMDocument::createElement()的第二个参数是元素的纯文本内容,所有HTML标签会被自动转义成实体,所以最终输出的是文本形式的标签,而非解析后的HTML元素。
下面是两种可行的解决方法:
方法一:使用DOMDocumentFragment解析HTML片段
$html='<div id="main"></div>'; $doc = new DOMDocument(); $doc->loadHTML('<?xml encoding="utf-8" ?>' .$html); $el = $doc->getElementById('main'); // 创建文档片段,直接加载并解析HTML内容 $fragment = $doc->createDocumentFragment(); // 若内容包含XML兼容标签,可直接用appendXML $fragment->appendXML('<div><h1> Hello world</h1></div>'); $el->appendChild($fragment); echo $doc->saveHTML();
如果你的HTML内容包含非XML兼容的标签(比如没有闭合的标签),可以改用临时DOMDocument加载后导入节点:
$html='<div id="main"></div>'; $doc = new DOMDocument(); $doc->loadHTML('<?xml encoding="utf-8" ?>' .$html); $el = $doc->getElementById('main'); $fragment = $doc->createDocumentFragment(); $innerHtml = '<div><h1> Hello world</h1></div>'; // 临时文档加载HTML内容 $tempDoc = new DOMDocument(); libxml_use_internal_errors(true); // 禁用无关的HTML结构警告 $tempDoc->loadHTML($innerHtml); libxml_clear_errors(); // 将临时文档body下的子节点导入到片段中 foreach ($tempDoc->getElementsByTagName('body')->item(0)->childNodes as $node) { $fragment->appendChild($doc->importNode($node, true)); } $el->appendChild($fragment); echo $doc->saveHTML();
方法二:先创建容器元素,再导入内部HTML节点
$html='<div id="main"></div>'; $doc = new DOMDocument(); $doc->loadHTML('<?xml encoding="utf-8" ?>' .$html); $el = $doc->getElementById('main'); // 先创建外层div容器 $appendedDiv = $doc->createElement('div'); $el->appendChild($appendedDiv); // 加载要插入的HTML内容 $innerHtml = '<div><h1> Hello world</h1></div>'; $tempDoc = new DOMDocument(); libxml_use_internal_errors(true); $tempDoc->loadHTML($innerHtml); libxml_clear_errors(); // 将临时文档的内部节点导入到容器中 foreach ($tempDoc->getElementsByTagName('body')->item(0)->childNodes as $node) { $appendedDiv->appendChild($doc->importNode($node, true)); } echo $doc->saveHTML();
内容的提问来源于stack exchange,提问作者sami salaam
相关产品推荐
相关产品推荐

