You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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处理配置引号保留规则:

  1. 打开策略文件,找到<css-rules>节点,添加preserve-quotes配置:
<css-rules>
  <!-- 其他原有规则保持不变 -->
  <property name="preserve-quotes" value="true"/>
</css-rules>

这个配置会告诉AntiSamy保留原始的引号类型,而不是强制统一转换为双引号。

  1. 同时检查<attribute name="style">的配置,确保它的处理规则没有限制单引号:
<attribute name="style">
  <regexp-list>
    <regexp value="^[\s\S]*$"/>
  </regexp-list>
  <css/>
</attribute>

确保<css/>标签没有额外的引号限制参数,保持默认的CSS处理逻辑即可。

修改完策略文件后,重新加载策略进行扫描,应该就能保留原始的单引号了。

3. 扫描后手动修正(临时hack方案)

如果上面两种方法都不适用,你可以在获取到清理后的HTML后,手动将style属性里的&quot;替换回单引号。注意要精准匹配,避免影响其他地方的合法双引号:

CleanResults cr = as.scan(dirtyContent, policy);
String cleanHtml = cr.getCleanHTML();
// 只替换style属性范围内的&quot;为单引号
cleanHtml = cleanHtml.replaceAll("(style=\"[^\"]*)&quot;([^\"]*)&quot;([^\"]*\")", "$1'$2'$3");
System.out.println(cleanHtml);

这个正则表达式会精准匹配style属性中的编码双引号,替换为单引号,不会干扰其他属性或文本中的双引号。


内容的提问来源于stack exchange,提问作者Gouravmoy Mohanty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:45:48