我试图解析HTML代码与DOM文档,做的东西一样改变它,然后组装起来回到我发送到输出的字符串。
但是,对于解析,这意味着什么,我发送到DOM文档并不总是回来相同形式的几个问题:)
这里有一个列表:
使用- > loadHTML :
- 格式我的文件不管
preserveWhitespace
和formatOutput
设置(预格式化文本失去空格) - 给我的错误,当我有像HTML5标记
<header>
,<footer>
等,但它们可以supressed,这样我就可以用这个活。 - 产生不一致的标记-例如,如果我添加
<link ... />
元素(具有自闭合标签),解析后/ saveHTML的输出将是<link .. >
- 格式我的文件不管
使用- > loadXML的 :
- 编码实体像
>
从<style>
或<script>
标签:body > div
变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内容,我不想...