Câu trả lời được chấp nhận khi thực hiện đơn giản Jsoup.parse(html).text()
có 2 vấn đề tiềm ẩn (với JSoup 1.7.3):
- Nó loại bỏ ngắt dòng khỏi văn bản
- Nó chuyển đổi văn bản
<script>
thành<script>
Nếu bạn sử dụng điều này để bảo vệ chống lại XSS, điều này hơi khó chịu. Đây là cách tốt nhất của tôi về một giải pháp cải tiến, sử dụng cả JSoup và 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);
Lưu ý rằng bước cuối cùng là vì tôi cần sử dụng đầu ra dưới dạng văn bản thuần túy. Nếu bạn chỉ cần đầu ra HTML thì bạn sẽ có thể loại bỏ nó.
Và đây là một loạt các trường hợp thử nghiệm (đầu vào đầu ra):
{"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"}
Nếu bạn tìm thấy một cách để làm cho nó tốt hơn, xin vui lòng cho tôi biết.