在PHP中解析格式错误的HTML

时间:2010-02-28 15:37:45

标签: php html parsing sax

在我的代码中,我使用openoffice将一些样式化的xls文档转换为html。 然后我使用xml_parser_create解析表。 问题是openoffice使用未公开的<BR><HR>标记创建oldschool html,它不会创建doctypes并且不引用属性<TABLE WIDTH=4>

我知道的PHP解析器不喜欢这个,并产生xml格式错误。我目前的解决方案是在解析之前对文件运行一些正则表达式,但这既不好也不快。

你知道一个(希望包含的)php-parser,它不关心这些错误吗?或者也许是一种快速修复'破坏'html的方法?

4 个答案:

答案 0 :(得分:8)

“修复”损坏的HTML的解决方案可能是使用HTMLPurifier (引用)

  

HTML Purifier符合标准   用PHP编写的HTML过滤器库。   
HTML Purifier不仅会删除   所有恶意代码(更好地称为   XSS)经过全面审核,   它安全但宽容的白名单   还将确保您的文档符合标准


另一种想法可能是尝试使用DOMDocument::loadHTML (引用)加载HTML:

  

该函数解析包含的HTML   在字符串源中。与装载不同   XML, HTML不一定是   格式良好加载。

如果您尝试从文件加载HTML,请参阅DOMDocument::loadHTMLFile

答案 1 :(得分:4)

SimpleHTML

要修复损坏的HTML,您可以使用Tidy

作为替代方案,您可以使用原生XML Reader。因为它在文档流中作为游标前进并在途中停止在每个节点上,所以它不会在无效的XML文档上中断。

请参阅http://www.ibm.com/developerworks/library/x-pullparsingphp.html

答案 2 :(得分:1)

您还在使用PHP 4 XML API的任何特殊原因吗?

如果您可以使用PHP 5的XML API,那么有两种可能性。

首先,尝试内置的HTML解析器。它真的不是很好(它往往会扼杀格式不佳的HTML),但它可能会成功。看看DomDocument :: LoadHTML。

第二个选项 - 您可以尝试基于HTML5解析器规范的HTML解析器:

http://code.google.com/p/html5lib/

这比内置的PHP HTML解析器更有效。它将HTML加载到DomDocument对象中。

答案 3 :(得分:0)

解决方案是使用DOMDocument。

示例:

$str = "
<html>
 <head>
  <title>test</title>
 </head>
 <body>
  </div>error.
  <p>another error</i>
 </body>
</html>
";

$doc = new DOMDocument();
@$doc->loadHTML($str);
echo $doc->saveHTML();

优点:本身包含在PHP中,与PHP Tidy相反。