我使用HTMLDom来操作字符串,而不是完整的网页。当我使用saveHTML()
时,它会自动引用doctype
和html
标记。
$str = 'frament containing html';
$str = utf8_encode($str);
$doc->LoadHTML($str);
...do stuff...
$str = $doc->saveHTML();
在不自动包含额外标记的情况下保存HTML片段的正确方法是什么。没错;删除这些额外标签的正确方法?
我使用了一个html解析器to avoid using regex's,所以在解析器的输出上使用它们似乎有点违反直觉。
答案 0 :(得分:2)
如果加载HTML,PHP DOMDocument会修复文档。这意味着它会添加html
和body
元素。
因此,您需要获取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_NOIMPLIED
和LIBXML_HTML_NODEFDTD
选项。
$dom->loadHtml($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
第一个最好的选择是更新PHP。不再维护PHP 5.3。
第二个选项是使用DOMDocument :: saveXML($ node,LIBXML_NOEMPTYTAG)。这将生成一个XML(XHTML)片段,但对于大多数情况应该足够了。
最后一个选项是使用字符串函数。