如何截断HTML字符串以删除损坏的无效HTML片段?

时间:2014-04-28 11:37:59

标签: java html client

在我的Java webapp中,我创建了长HTML文本的摘要文本。在截断过程中,字符串中的HTML片段经常断开,产生带有无效&的HTML字符串。破碎的碎片。像这个示例HTML字符串:

Visit this link <img src="htt

是否有任何Java库可以更好地处理这个问题,以避免上述碎片碎片?

或者我可以将它包含在HTML页面中吗?以某种方式使用客户端代码处理这个问题?

2 个答案:

答案 0 :(得分:0)

由于浏览器通常能够处理几乎所有垃圾(如果它不是XHTML ......),如果输入实际发生的唯一事情(假设它是任何类型的有效HTML)正在切片,那么你唯一要担心的是实际摆脱无效的开口标签;你将无法区分标签的破碎“结尾”,因为它们本身并不是特殊的。我只需要生成一个切片并从最后解析它;如果我遇到一个迷路的'&lt;',我会在它之后摆脱一切。同样地,我会跟踪最后打开的标签 - 如果下一次关闭之后它没有关闭那个确切的标签,那么很可能是结束标签出来了,所以我会插入它。

这仍会产生大量垃圾,但至少会解决一些基本问题。

更好的方法是管理一堆打开/关闭的标签,并在它们出现时生成/删除所需/已损坏/不必要的标签。堆栈是一个合适的解决方案,因为HTML标签不是'交叉'[规范,AFAIR就是这样来自HTML 4],即&lt; span&gt;&lt; div&gt;&lt; / span&gt; &LT; / DIV&GT;无效。

更好的方法是在首次将文档解析为SGML / HTML / XML (取决于确切的HTML文档类型)之后拼接文档 - 然后您可以删除节点,而不会损坏文档结构

请注意,如果没有提供用于生成此“乱码”内容的精确算法,您实际上无法确定标记是否正确。

答案 1 :(得分:0)

我使用owasp-java-html-sanitizer来修复那些损坏的片段,以便从Java生成安全的HTML标记。

PolicyFactory html_sanitize_policy = Sanitizers.LINKS.and(Sanitizers.IMAGES);
String safeHTML = html_sanitize_policy.sanitize(htmlString);

这似乎是我遇到的所有解决方案中最简单的。