Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何保存为HTML片段,而不是完整的DOM模型_Php_Html_Regex_Dom - Fatal编程技术网

Php 如何保存为HTML片段,而不是完整的DOM模型

Php 如何保存为HTML片段,而不是完整的DOM模型,php,html,regex,dom,Php,Html,Regex,Dom,问题是:我有一个将HTML片段保存到服务器端的网页。问题是,在PHP中,当我启动DOMDocument解析器,向给定元素添加自定义属性并将HTML保存为文件时,它会添加HTML、body、,以及其他不必要的元素,这些元素显然是无效的,因为该片段将作为HTML片段返回浏览器,插入DOM模型中,并且无效(不能嵌套HTML/BODY)。下面是我的代码的一个快速示例: $html="<div><magic></magic> <video controls>

问题是:我有一个将HTML片段保存到服务器端的网页。问题是,在PHP中,当我启动DOMDocument解析器,向给定元素添加自定义属性并将HTML保存为文件时,它会添加HTML、body、,以及其他不必要的元素,这些元素显然是无效的,因为该片段将作为HTML片段返回浏览器,插入DOM模型中,并且无效(不能嵌套HTML/BODY)。下面是我的代码的一个快速示例:

$html="<div><magic></magic>
 <video controls></video>
    <a href='http://example.com'>Example</a><br>
    <a href='http://google.com'>Google</a><br></div>
 ";

$dom = new DOMDocument();
$dom->loadHTML($html); 
$html=$dom->C14N();
echo $html;
$html=”


"; $dom=新的DOMDocument(); $dom->loadHTML($html); $html=$dom->C14N(); echo$html;
但它表明:

<html>
<body>
<div>
<magic></magic>
<video controls=""></video>
<a href="http://example.com">Example</a>
<br></br>
<a href="http://google.com">Google</a>
<br></br>
</div>
</body>
</html>





如何只保存片段化的HTML?我提出了$dom->C14N(),但它仍然添加了html和body标记。它还添加了

,但这没什么大不了的


在这一点上,我求助于preg_replace来删除html和body标记,但如果有办法将其保存为片段,那就太好了

您需要像这样初始化DOM结构:

$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$html=$dom->saveHTML();
见:

LIBXML\u HTML\u未嵌入
()
设置
HTML\u PARSE\u NOIMPLIED
标志,该标志关闭隐含HTML/body的自动添加。。。元素

LIBXML\u HTML\u NODEFDTD
()
设置
HTML\u PARSE\u NODEFDTD
标志,以防止在找不到默认doctype时添加默认doctype


您尝试过简单的
save
方法吗?使用
$dom->loadHTML($html,LIBXML\u html\u NOIMPLIED,LIBXML\u html\u NODEFDTD)
$html=$dom->saveHTML()@WiktorStribiżew解决了问题。请回答,这样我就可以接受它作为我问题的答案。谢谢。@netrox:我发布了一个答案。可能重复使用
LIBXML\u HTML\u NOIMPLIED
选项会导致某些标记无法正确呈现,如果是这样,则需要解决方法。有关详细说明,请参阅。