简单地做 Jsoup.parse(html).text() 的公认答案有 2 个潜在问题(使用 JSoup 1.7.3):
- 它从文本中删除换行符
- 它将文本
&lt;script&gt; 转换为<script>
如果你用它来防御 XSS,这有点烦人。这是我使用 JSoup 和 Apache StringEscapeUtils 改进解决方案的最佳方法:
// breaks multi-level of escaping, preventing &lt;script&gt; to be rendered as <script>
String replace = input.replace("&", "");
// decode any encoded html, preventing <script> to be rendered as <script>
String html = StringEscapeUtils.unescapeHtml(replace);
// remove all html tags, but maintain line breaks
String clean = Jsoup.clean(html, "", Whitelist.none(), new Document.OutputSettings().prettyPrint(false));
// decode html again to convert character entities back into text
return StringEscapeUtils.unescapeHtml(clean);
请注意,最后一步是因为我需要将输出用作纯文本。如果您只需要 HTML 输出,那么您应该可以将其删除。
这里有一堆测试用例(输入到输出):
{"regular string", "regular string"},
{"<a href=\"link\">A link</a>", "A link"},
{"<script src=\"http://evil.url.com\"/>", ""},
{"<script>", ""},
{"&lt;script&gt;", "lt;scriptgt;"}, // best effort
{"\" ' > < \n \\ é å à ü and & preserved", "\" ' > < \n \\ é å à ü and & preserved"}
如果您找到改进的方法,请告诉我。