如何配置Jsoup避免将单引号替换为双引号?
解决Jsoup清理HTML时保留原引号格式的问题
问题核心在于Jsoup默认会把属性的单引号统一转为双引号,导致你的isHTMLStringPolluted方法误判合法的单引号属性HTML为“污染”内容。只需调整Jsoup的输出配置,让它保留原始的引号格式就能解决。
修改后的核心代码
调整sanitizeHTML方法中的OutputSettings,添加quoteMode(QuoteMode.PRESERVE)配置:
import org.jsoup.nodes.Document; import org.jsoup.safety.Safelist; import org.jsoup.nodes.Document.QuoteMode; public static String sanitizeHTML(String html) { return Jsoup.clean(html, "", Safelist.relaxed() .addAttributes(":all", "style") .addAttributes(":all", "class"), new Document.OutputSettings() .prettyPrint(false) .quoteMode(QuoteMode.PRESERVE)); // 关键配置:保留原引号格式 }
关键说明
- QuoteMode.PRESERVE的作用:该配置会让Jsoup在输出清理后的HTML时,完全保留原始属性的引号类型(单引号或双引号),不会强制统一为双引号。这样合法的单引号属性HTML在清理后与原内容一致,
isHTMLStringPolluted就会返回false,验证通过。 - 版本要求:确保使用的Jsoup版本在1.14.0及以上,因为
QuoteMode.PRESERVE是在这个版本新增的,旧版本需要先升级依赖。 - 兼容混合引号场景:如果用户输入中存在同一标签混合单双引号的情况,Jsoup也会如实保留,完全符合你“要么完全通过要么被拒绝”的验证逻辑。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

