2008-09-15 57 views
4

我有一堆类似HTML的遗留文档。如在HTML中,他们看起来像HTML,但有额外的组成标签,不是HTML的一部分在PHP中容错HTML/XML/SGML解析

<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知道其他标签被视为有效的方法?有没有一个不同的,健壮的HTML解析类/对象用于PHP?

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

更新:在假标签的信息是目标的一部分在这里,所以像整齐不一个选项。另外,我在为某些层次(如果不是全部的话)进行了格式清理,这就是为什么我首先查找DomDocument的loadHTML方法的原因。

回答

5

在加载文档时,您可以用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); 

如果由于某种原因,你需要访问的警告,使用libxml_get_errors

2

我想知道如果通过HTML Tidy传递“坏”HTML可能有助于第一遍?值得一看,如果你能够使文档形成良好,也许你可以把它作为一个常规的XML文件加载到DomDocument中。

+0

道歉,我本来应该更具体,什么我需要分析出该文件的部分是什么在假标签中找到。 – 2008-09-15 21:07:03

+0

我建议HTMLTidy作为一个预处理步骤,试图让你形成良好的XML,然后你可以用DomDocument解析它,并读取整个DOM,并带有任何好运:) – 2008-09-15 21:27:15

+0

不会整理去掉伪造标记以及所有格式化它呢? – 2008-09-17 02:12:08

1

@Twan 您不需要用于解析自定义XML的DOMDocument的DTD。只要使用DOMDocument->load(),并且只要XML格式良好,就可以读取它。

一旦你得到的文件格式良好,那就是当你可以开始查看XML解析器时,在这之前你是S.O.L. Lok Alejo说,你可以看看HTML TIDY,但它看起来像HTML特有的,我不知道它会如何与您的自定义元素。

我不认为正则表达式这里

一个有效的解决方案,直到你良构,这可能是你唯一的选择。一旦你获得了文档到这个阶段,那么你就明白了DOM的功能。

+0

当你使用DOMDocument加载一个HTML文件时,它似乎做了一些清理级别:格式良好,但要求你所有的标签都是合法的HTML标签。我正在寻找一些前者,但不是后者。 – 2008-09-15 22:15:19

0

我的快速和肮脏的解决这个问题是要运行一个符合循环我用正则表达式定制标签列表。正则表达式不捕获在其内部具有另一个内部自定义标签的标签。

当匹配时,处理该标记的函数被调用并返回“处理的HTML”。如果该自定义标签位于另一个自定义标签内,而不是由于实际的HTML插入到子代中而变为无子标签,并且它将与正则表达式匹配并在该循环的下一次迭代中处理。

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

0

@Alan风暴

你我的其他答案的评论让我的思维:

当加载与DOM文档HTML文件时,被用来做重新清理某种程度:好良好形成性,但要求你所有的标签都是合法的HTML标签。我正在寻找一些前者,但不是后者。 (Alan Storm)

对标签运行一个正则表达式(对不起!),当它找到一个不是有效的HTML元素时,用一个你知道不存在的有效元素替换它的文件(blink想到...),并给它一个属性值与非法元素的名称,以便您可以在之后切换回来。例如:

$code = str_replace("<pseudo-tag>", "<blink rel=\"pseudo-tag\">", $code); 
// and then back again... 
$code = preg_replace('<blink rel="(.*?)">', '<\1>', $code); 

很明显,代码将无法正常工作,但您会得到一般想法?