如何使HTML5的工作与DOM文档?(How to make HTML5 work with DOM

2019-06-24 17:20发布

我试图解析HTML代码与DOM文档,做的东西一样改变它,然后组装起来回到我发送到输出的字符串。

但是,对于解析,这意味着什么,我发送到DOM文档并不总是回来相同形式的几个问题:)

这里有一个列表:

  1. 使用- > loadHTML :

    • 格式我的文件不管preserveWhitespaceformatOutput设置(预格式化文本失去空格)
    • 给我的错误,当我有像HTML5标记<header><footer>等,但它们可以supressed,这样我就可以用这个活。
    • 产生不一致的标记-例如,如果我添加<link ... />元素(具有自闭合标签),解析后/ saveHTML的输出将是<link .. >
  2. 使用- > loadXML的 :

    • 编码实体像><style><script>标签: body > divbody &gt; div body &gt; 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内容,我不想...

Answer 1:

不幸的是,也可能幸运的是,DOM文档被设计成不尝试保留原始文件格式。 这是通过将所有的元素相同的样式,使解析器的内部状态更易于管理。 据我所知大多数解析器会在内存中创建一个树表示,而不用担心文本格式,直到用户请求等。 这就是为什么你的自我封闭标签有独立的结束标记输出。 好消息是,它并不重要。

至于式标签和脚本标记得到<>转换为&lt;&gt; ,您可以通过在周围用正是如此推荐CDATA标签问题的元素的内容,以避免转换:

<style>
  /*<![CDATA[*/
    body > div {
      width: 50%;
    }
  /*]]>*/
</style>

注释/* */周围的CDATA声明应允许破客户不知道CDATA节,而是把声明为CSS代码。 如果您使用的内部文件只有这样,你可以省略/* */注释包围并只有在CDATA声明。 您可能会遇到的问题与上述破碎客户,如果你操作文档,然后将它发送到浏览器不检查,以确保/* */注释保留; 我不确定是否DOM文档将保留这些与否。



Answer 2:

使用html5lib 。 它可以解析HTML5和产生一个DOMDocument。 例:

require_once '/path/to/HTML5/Parser.php';
$dom = HTML5_Parser::parse('<html><body>...');

文档



Answer 3:

如果你想支持HTML5,完全不碰DOM文档。

目前最好的选择似乎是https://github.com/Masterminds/html5-php

以前,最好的选择是https://github.com/html5lib/html5lib-php但作为描述说,这是“目前没有维护”。 这已被地位自2011年10月,所以我不屏住呼吸了。

我没有使用html5-php生产,所以我不能提供任何真实世界的体验。 我用html5lib-php在生产,我会说,这是正确的解析以及形成的文件,但它有一些简单的语法错误意外错误。 在另一方面,它似乎正确地实现了收养机构算法和其他一些怪异的极端情况。 如果html5lib-php仍然保持着,我还是更喜欢它。 然而,就目前的立场,我宁愿使用html5-php和可能的帮助有固定剩余的错误。



Answer 4:

我想这两个html5lib和html5php但也有我提供的HTML工作。 这是能够解析HTML的选择是: https://github.com/ivopetkov/html5-dom-document-php

主要的类扩展PHP的原生的DomDocument。



Answer 5:

当初始化DOM文档,操作步骤如下:

$dom = new DOMDocument(5, 'UTF-8');


文章来源: How to make HTML5 work with DOMDocument?