我正在尝试使用 DOMDocument 解析 HTML 代码,对其进行更改等操作,然后将其组装回我发送到输出的字符串。
但是在解析方面存在一些问题,这意味着我发送到 DOMDocument 的内容并不总是以相同的形式返回:)
这是一个列表:
使用 ->loadHTML :
- 无论
preserveWhitespace
如何格式化我的文档和formatOutput
设置(丢失预格式化文本上的空格) - 当我有像
<header>
这样的 html5 标签时给我错误,<footer>
等等。但它们可以被抑制,所以我可以接受。 - 产生不一致的标记——例如,如果我添加
<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 内容,这是我不想要的......
最佳答案
使用html5lib .它可以解析 html5 并生成 DOMDocument。示例:
require_once '/path/to/HTML5/Parser.php';
$dom = HTML5_Parser::parse('<html><body>...');
关于php - 如何使 HTML5 与 DOMDocument 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10712503/