使用 ->loadHTML:
- 无论
preserveWhitespace
和formatOutput
设置如何,都会格式化我的文档(在预格式化文本上丢失空格) - 如果我有像
<header>
、<footer>
等 html5 标签,它会给我报错。但是可以通过抑制来解决,所以我可以接受这一点。 - 生成不一致的标记 - 例如,如果我添加一个
<link ... />
元素(带有自闭合标记),解析/保存 HTML 后输出将是<link .. >
- 无论
使用 ->loadXML:
- 编码实体,如
>
来自<style>
或<script>
标记:body > div
变成body > div
- 所有标记都以相同的方式关闭,例如
<meta ... />
变成<meta...></meta>
;但这可以用正则表达式修复。
- 编码实体,如
我没有尝试过HTML5lib,但出于性能原因,我更喜欢使用DOMDocument而不是自定义解析器
更新:
就像Honeymonster提到的那样,使用CDATA可以解决loadXML的主要问题。
有没有什么方法可以防止除了特定集合以外的所有空HTML标签自动关闭,而不使用正则表达式?
现在我有:
$html = $dom->saveXML($node);
$html = preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($matches){
// ignore only these tags
$xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', 'area', 'link', 'col', 'base', 'basefont', 'param' ,'meta');
// if a element that is not in the above list is empty,
// it should close like `<element></element>` (for eg. empty `<title>`)
return in_array($matches[1], $xhtml_tags) ? "<{$matches[1]}{$matches[2]} />" : "<{$matches[1]}{$matches[2]}></{$matches[1]}>";
}, $html);
这段代码是有效的,但它也会在CDATA内容中进行替换,而我不希望这样做...