带有额外标签的 DOMDocument 保存 html

DOMDocument saving html with extra tags

我正在使用 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,因此必须在解析器的输出上使用它们似乎有点违反直觉。

PHPs DOMDocument 会在您加载 HTML 时修复文档。这意味着它添加了 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 <= 5.3

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

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

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