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

时间:2017-03-19 07:10:36

标签: php html regex dom

问题在于:我有一个网页可以将HTML片段保存到服务器端。问题是在PHP中,当我启动DOMDocument解析器时,将自定义属性添加到给定元素并将HTML保存为文件,它实际上添加了html,正文和其他显然不会有效的不必要元素因为该片段将作为要插入DOM模型的HTML片段返回浏览器,并且它将无效(您不能嵌套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>
<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-&gt; C14N()但它仍然添加了html和body标签。它还增加了</br>,但这没什么大不了的。

此时,我正在使用preg_replace删除html和body标签,但如果有一种方法可以将其保存为片段,那将会很好。

1 个答案:

答案 0 :(得分:1)

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

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

请参阅PHP documentation

  

LIBXML_HTML_NOIMPLIEDinteger
  设置HTML_PARSE_NOIMPLIED标志,关闭自动添加隐含的html / body ...元素。

     

LIBXML_HTML_NODEFDTDinteger
  设置HTML_PARSE_NODEFDTD标志,以防止在找不到默认文档类型时添加默认文档类型。