代码之家  ›  专栏  ›  技术社区  ›  Thomas Ahle

在PHP中解析格式错误的HTML

  •  9
  • Thomas Ahle  · 技术社区  · 14 年前

    在我的代码中,我使用OpenOffice将一些样式化的XLS文档转换为HTML。 然后我用 xml_parser_create . 问题是,OpenOffice创建的Oldschool HTML没有关闭 <BR> <HR> 标签,它不创建doctypes,也不引用属性 <TABLE WIDTH=4> .

    我知道的PHP解析器不喜欢这样,会产生XML格式错误。我目前的解决方案是在解析文件之前对它运行一些regex,但这既不好也不快。

    你知道(希望包括)一个PHP解析器,它不关心这些错误吗?或者是修复“坏掉的”HTML的快速方法?

    4 回复  |  直到 7 年前
        1
  •  8
  •   Pascal MARTIN    14 年前

    解决“修复”损坏的HTML的方法是 HTMLPurifier (引用) :

    HTML净化器符合标准 用PHP编写的HTML过滤器库。
    HTML净化器将不仅删除 所有恶意代码(通常称为 xss)经彻底审计, 安全但允许的白名单,它 还将确保您的文档符合标准


    另一种方法可能是尝试用 DOMDocument::loadHTML (引用) :

    函数解析包含的HTML 在字符串源中。与加载不同 XML HTML不必是 成形良好 加载。

    如果要从文件加载HTML,请参见 DOMDocument::loadHTMLFile .

        2
  •  4
  •   Gordon Haim Evgi    14 年前

    SimpleHTML

    对于修复损坏的HTML,可以使用 Tidy .

    作为替代方案,您可以使用本机 XML Reader . 因为它是一个光标,在文档流中向前移动并在途中在每个节点处停止,所以它不会在无效的XML文档上中断。

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

        3
  •  1
  •   BlackAura    14 年前

    您仍然使用PHP4XMLAPI有什么特别的原因吗?

    如果您可以摆脱使用PHP5的XML API,有两种可能。

    首先,尝试使用内置的HTML解析器。这真的不是很好(在格式不好的HTML上很容易窒息),但它可能会起作用。请看一下domDocument::loadHTML。

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

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

    这往往比内置的php-html解析器工作得更好。它将HTML加载到domDocument对象中。

        4
  •  0
  •   Jerry    7 年前

    解决方案是使用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整洁相反。