php - 如何使 HTML5 与 DOMDocument 一起工作?

标签 php html domdocument

我正在尝试使用 DOMDocument 解析 HTML 代码,对其进行更改等操作,然后将其组装回我发送到输出的字符串。

但是在解析方面存在一些问题,这意味着我发送到 DOMDocument 的内容并不总是以相同的形式返回:)

这是一个列表:

  1. 使用 ->loadHTML :

    • 无论preserveWhitespace如何格式化我的文档和 formatOutput设置(丢失预格式化文本上的空格)
    • 当我有像 <header> 这样的 html5 标签时给我错误, <footer>等等。但它们可以被抑制,所以我可以接受。
    • 产生不一致的标记——例如,如果我添加 <link ... />元素(带有自闭合标签),在解析/保存 HTML 后输出将为 <link .. >
  2. 使用 ->loadXML :

    • 编码像>这样的实体来自 <style><script>标签: body > 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 内容,这是我不想要的......

最佳答案

使用html5lib .它可以解析 html5 并生成 DOMDocument。示例:

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

Documentation

关于php - 如何使 HTML5 与 DOMDocument 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10712503/

相关文章:

PHP & MySQL 删除与文章问题相关的所有评论

php - 在 PHP 中使用 PGSQL

php - 从 $_GET/$_POST 获取信息并将其保存到数据库的做法?

php - 使用 RewriteRule 发送 POST 数据

javascript - onclick 不触发功能(通过 innerHTML 创建的按钮)

javascript - 单击提交后重置表单

php - SimpleXML 与 DOMDocument 性能对比

javascript - 如何为前几行组制作 "sum"列

PHP DOM XML 不在标记后打印出换行符

php - 在 PHP 中搜索 HTML 文档