AntiSamy移除<script>标签后内容丢失问题求助
AntiSamy扫描后返回空字符串而非预期"testing"的问题解决
我来帮你拆解下这个问题,你遇到的情况大概率是未闭合的<script>标签加上AntiSamy的解析逻辑导致的,下面一步步给你分析和解决:
问题根源
你提供的代码里,dirtyContent的第一个<script>标签没有正确闭合:
String dirtyContent = "<script>test<script>testing";
AntiSamy的HTML解析器会把未闭合的标签判定为「后续所有内容都属于该标签的内部」,所以它会把从第一个<script>开始到结尾的全部内容都识别为脚本内容,最终一次性移除,导致返回空字符串。
另外也需要确认你的策略文件配置是否合理,如果策略对<script>标签的处理过于严格(比如连带父容器一起移除),也可能出现类似情况,但最常见的诱因还是未闭合标签的问题。
解决方案
1. 修正未闭合的标签
先把代码里的<script>标签正确闭合,这是最直接的修复方式:
String dirtyContent = "<script>test</script>testing"; // 将第二个<script>替换为</script> CleanResults cr = as.scan(dirtyContent, policy); System.out.println(cr.getCleanHTML()); // 现在应该输出预期的"testing"
2. 检查并调整策略文件配置
确保你的AntiSamy策略文件(比如默认的antisamy-slashdot.xml或自定义策略)里对<script>标签的配置是action="remove",这个配置会移除标签及其内部内容,但保留标签外的正常文本:
<tag name="script" action="remove"/>
同时要确保策略允许保留普通文本内容,可在策略的directives部分添加相关配置:
<directives> <directive name="omitXmlDeclaration" value="true"/> <directive name="maxInputSize" value="100000"/> <!-- 明确允许保留文本节点 --> <directive name="allowTextNodes" value="true"/> </directives>
3. 额外优化:预处理不规范HTML
如果你的输入内容经常存在不规范的HTML(比如大量未闭合标签),可以先使用HTML修复工具(如Jsoup)做预处理,把不规范标签修复后再传给AntiSamy:
// 先用Jsoup修复未闭合标签 String preprocessedHtml = Jsoup.clean(dirtyContent, Whitelist.none()); // 再传给AntiSamy扫描 CleanResults cr = as.scan(preprocessedHtml, policy);
按照上面的步骤调整后,应该就能得到你预期的"testing"输出了。
内容的提问来源于stack exchange,提问作者Gouravmoy Mohanty
相关产品推荐
相关产品推荐

