Antisamy扫描HTML时单引号被转为双引号的问题求助
解决AntiSamy将单引号转换为编码双引号的问题
我之前也碰到过类似的困扰,AntiSamy 1.5.3版本在处理style属性里的单引号时确实有这个奇怪的行为——它会把单引号转成编码后的双引号("),解码后就变成了双引号,这很容易打乱样式的预期效果。下面给你几个可行的解决方案:
1. 优先升级AntiSamy版本
AntiSamy 1.5.3是比较老旧的版本(发布于2014年),后续版本已经修复了不少这类引号处理的细节问题。建议你直接升级到最新的稳定版本(比如目前的1.6.5或更高),很多情况下升级后这个问题会自动消失。
你只需要修改项目依赖(比如Maven的pom.xml),把版本号更新为最新版,重新构建项目后再测试扫描效果即可。
2. 自定义策略文件调整引号规则
如果因为项目限制无法升级版本,可以修改antisamy-anythinggoes.xml策略文件,针对style属性的CSS处理配置引号保留规则:
- 打开策略文件,找到
<css-rules>节点,添加preserve-quotes配置:
<css-rules> <!-- 其他原有规则保持不变 --> <property name="preserve-quotes" value="true"/> </css-rules>
这个配置会告诉AntiSamy保留原始的引号类型,而不是强制统一转换为双引号。
- 同时检查
<attribute name="style">的配置,确保它的处理规则没有限制单引号:
<attribute name="style"> <regexp-list> <regexp value="^[\s\S]*$"/> </regexp-list> <css/> </attribute>
确保<css/>标签没有额外的引号限制参数,保持默认的CSS处理逻辑即可。
修改完策略文件后,重新加载策略进行扫描,应该就能保留原始的单引号了。
3. 扫描后手动修正(临时hack方案)
如果上面两种方法都不适用,你可以在获取到清理后的HTML后,手动将style属性里的"替换回单引号。注意要精准匹配,避免影响其他地方的合法双引号:
CleanResults cr = as.scan(dirtyContent, policy); String cleanHtml = cr.getCleanHTML(); // 只替换style属性范围内的"为单引号 cleanHtml = cleanHtml.replaceAll("(style=\"[^\"]*)"([^\"]*)"([^\"]*\")", "$1'$2'$3"); System.out.println(cleanHtml);
这个正则表达式会精准匹配style属性中的编码双引号,替换为单引号,不会干扰其他属性或文本中的双引号。
内容的提问来源于stack exchange,提问作者Gouravmoy Mohanty
相关产品推荐
相关产品推荐

