DOMDocument使用额外的标签保存html

时间:2015-02-19 21:54:44

标签: php dom

我使用HTMLDom来操作字符串,而不是完整的网页。当我使用saveHTML()时,它会自动引用doctypehtml标记。

$str = 'frament containing html';
$str = utf8_encode($str);
$doc->LoadHTML($str);
...do stuff...
$str = $doc->saveHTML();

在不自动包含额外标记的情况下保存HTML片段的正确方法是什么。没错;删除这些额外标签的正确方法?

我使用了一个html解析器to avoid using regex's,所以在解析器的输出上使用它们似乎有点违反直觉。

1 个答案:

答案 0 :(得分:2)

如果加载HTML,PHP DOMDocument会修复文档。这意味着它会添加htmlbody元素。

因此,您需要获取body中的所有节点并将其另存为HTML。

$html = <<<'HTML'
<h1>Hello World</h1>
Text
<!-- comment -->
HTML;

$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXPath($dom);

$result = '';
foreach ($xpath->evaluate('/html/body/node()') as $node) {
  $result .= $dom->saveHtml($node);
}

echo $result;

这是另一种选择,但它还没有到处都可用。 PHP添加了LIBXML_HTML_NOIMPLIEDLIBXML_HTML_NODEFDTD选项。

$dom->loadHtml($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

PHP&lt; = 5.3

第一个最好的选择是更新PHP。不再维护PHP 5.3。

第二个选项是使用DOMDocument :: saveXML($ node,LIBXML_NOEMPTYTAG)。这将生成一个XML(XHTML)片段,但对于大多数情况应该足够了。

最后一个选项是使用字符串函数。