PHP SAX解析器用于HTML?

3
我需要一个能够处理无效HTML代码的PHP HTML SAX(而非DOM)解析器。我需要它来过滤用户输入的HTML(删除除允许标签和属性之外的所有标签和属性),并将HTML内容截断到指定长度。
有什么好的建议吗?

你好,我目前也在寻找这样的工具。不知道你是否仍在使用HTML SAX解析器,或者已经找到了其他替代方案? - aurora
Tidy是处理“无效HTML代码”的独特“通用解决方案”,而PHP具有内置良好的SAX(!)请参见我的下面的答案 - Peter Krauss
请参考类似问题:https://dev59.com/vXDXa4cB1Zd3GeqP9zzt - Peter Krauss
4个回答

4

SAX被设计用来处理有效的XML并在无效的标记上失败。处理无效的HTML标记需要保持比SAX解析器通常保持更多的状态。

我不知道是否有类似于SAX的HTML解析器。你最好先使用Tidy对HTML进行清理,然后再使用XML解析器,但这可能会挫败你一开始使用SAX解析器的目的。


即使整理过的 HTML 片段也不会有效。它们是这样的: some comment with <b>bold text</b>, <i>italic text</i>.对于任何 XML 解析器来说,这都是无效的文档。它没有根元素,但我不想用某个根元素包装内容。 - Daniel
@Daniel,你为什么需要一个事件处理程序呢?如果HTML片段很短,我看不出有什么强制性的理由。 - Artefacto
@Daniel 抱歉,我指的是像SAX这样的事件驱动API。 - Artefacto
哦,我已经使用SAX解析器实现了代码,它非常高效和简单,但它的问题在于SAX解析器本身。它使用正则表达式来解析HTML :( - Daniel
@Daniel 使用正则表达式进行HTML解析 => 出现问题 - Artefacto
同意。这就是为什么我正在寻找更好的东西。 - Daniel

1

我尝试过使用它,但由于它基于正则表达式,无法处理嵌入的JS或复杂的样式。 - Daniel
我用它来解决你正在尝试解决的问题。我过滤用户生成的内容,剪切JavaScript、标签和属性。 - Murad X

1

总的来说,包含两个步骤:

  1. 使用 Tidy 将“自由HTML”转换为“好的XHTML”。
  2. 使用 XML解析器 通过 SAX API 将XHTML作为XML解析。

使用首先Tidy(!)将"自由HTML"转换为XHTML(或者当您不能信任您的"所谓XHTML"时)。请参见cleanRepair方法。它需要更多时间,但可以处理大文件(!)...如果太大,请设置几分钟作为最大执行时间

另一种选项(用于处理大文件)是在检查或转换为XHTML后缓存您的XHTML文件。请参见Tidy的repairfile方法。

对于一个"可信的XHTML",使用SAX...如何在PHP中使用SAX?

使用SAX标准API解析XML,在PHP中由LibXML实现(请参见xmlsoft.orgLibXML2),其接口是PHP的XML解析器,接近于SAX标准API
使用另一种方式使用“LibXML2的SAX”,使用另一个接口(PHP迭代器而不是传统的SAX接口),是使用XMLReader。请参阅有关“XMLReader使用SAX”的说明

是的,术语"SAX"或"SAX API"在PHP手册中没有明确表达。请参见这篇旧但好的介绍


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接