错误容忍PHP中的HTML/XML/SGML解析

Ala*_*orm 5 html php xml parsing

我有一堆类似HTML的遗留文档.就像在,它们看起来像HTML,但有其他组成的标签,不是HTML的一部分

<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>
Run Code Online (Sandbox Code Playgroud)

我需要解析这些文件.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 ....
Run Code Online (Sandbox Code Playgroud)

我能够想到的唯一解决方案是使用字符串替换函数预处理文件,这些函数将删除无效标记并将其替换为有效的HTML标记(可能是标记名称为id的span).

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

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

更新:假标签中的信息是此处目标的一部分,因此像Tidy这样的东西不是一个选项.另外,我正在处理一些对我来说具有某种程度(如果不是全部)格式良好清理的东西,这就是为什么我首先要查看DomDocument的loadHTML方法.

tro*_*skn 6

您可以libxml_use_internal_errors在加载文档时禁止显示警告.例如.:

libxml_use_internal_errors(true);
$doc = new DomDocument();
$doc->loadHTML("<strong>This is an example of a <pseud-template>fake tag</pseud-template></strong>");
libxml_use_internal_errors(false);
Run Code Online (Sandbox Code Playgroud)

如果出于某种原因需要访问警告,请使用 libxml_get_errors

  • 你应该等几个星期,你可以得到"两年后的正确答案徽章!" (3认同)