我试图使用DOMDocument解析HTML代码,做一些改变的东西,然后将其组合到一个我发送到输出的字符串。
但是有一些关于解析的问题,这意味着我发送给DOMDocument并不总是以相同的形式回来:)
这里有一个列表:
>格式化我的文档,不管preserveWhitespace和formatOutput设置(在预格式化文本上丢失空格)
>当我有html5标签,如< header>,< footer>时给我错误等等,但他们可以被压制,所以我可以生活在这里。
>产生不一致的标记 – 例如,如果我添加了< link ... />元素(具有自我关闭标签),在解析/保存HTML之后,输出将为< link ..>
>编码实体,如>来自< style>或< script>标签:body> div变成body& gt DIV
>所有标签都以相同的方式关闭,例如< meta ... />成为< meta ...>< / meta> ;;但是这可以用正则表达式修正。 我没有尝试HTML5lib,但是由于性能原因,我更喜欢DOMDocument而不是自定义解析器 更新: 所以就像使用CDATA的Honeymonster一样,修正了loadXML的主要问题。 有没有什么办法可以防止自动关闭所有空的HTML标签,除了某个集合,而不使用正则表达式? 现在我有:
$html = $dom->saveXML($node);
$html = preg_replace_callback('#]*)\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 `` (for eg. empty `
`)return in_array($matches[1], $xhtml_tags) ? "" : "{$matches[1]}>";
}, $html);
它的作品,但它也将在CDATA内容的替代,我不想要…