30 PHP 中的容错 HTML/XML/SGML 解析

我有一堆类似 HTML 的遗留文档。例如,它们看起来像 HTML,但有额外的不属于 HTML 的组成标签

<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>

我需要解析这些文件。 PHP 是唯一可用的工具。这些文档并不接近于格式良好的 XML。

我最初的想法是在 PHP DOMDocument 上使用 loadHTML 方法。但是,这些方法会阻塞 HTML 标签,并且会拒绝解析字符串/文件。

$oDom = new DomDocument();
$oDom->loadHTML('<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>');
//gives us
DOMDocument::loadHTML() [function.loadHTML]: Tag pseud-template invalid in Entity, line: 1 occured in ....

我能想到的唯一解决方案是使用字符串替换函数对文件进行预处理,该函数将删除无效标签并用有效的 HTML 标签替换它们(可能是带有标签 id 的跨度名称)。

有没有更优雅的解决方案?一种让 DOMDocument 知道其他标签被认为是有效的方法吗?是否有针对 PHP 的不同的、强大的 HTML 解析类/对象?

(如果不是很明显,我不认为正则表达式是一个有效的解决方案)

更新:虚假标签中的信息是这里目标的一部分,因此不能选择 Tidy。另外,我正在寻找一些可以为我完成某种程度(如果不是全部)格式良好的清理工作,这就是为什么我首先查看 DomDocument 的 loadHTML 方法的原因。

请先 登录 后评论

1 个回答

Gilles

我对这个问题的快速而肮脏的解决方案是运行一个循环,将我的自定义标签列表与正则表达式匹配。正则表达式不会捕获其中包含另一个内部自定义标签的标签。

当匹配时,会调用处理该标签的函数并返回“处理后的 HTML”。如果该自定义标签在另一个自定义标签内,那么由于实际 HTML 被插入到子标签的位置,父标签就变成了无子标签​​,并且它将被正则表达式匹配并在循环的下一次迭代中处理。

当没有要匹配的无子自定义标签时,循环结束。总的来说,它是迭代的(while 循环)而不是递归的。

请先 登录 后评论