Предполагается, что анализируются строки, а не документы HTML (согласно вашему вопросу), этот метод будет работать:
public String escapeHtml(String source) {
Document doc = Jsoup.parseBodyFragment(source);
Elements elements = doc.select("b");
for (Element element : elements) {
element.replaceWith(new TextNode(element.toString(),""));
}
return Jsoup.clean(doc.body().toString(), new Whitelist().addTags("a").addAttributes("a", "href", "name", "rel", "target"));
}
Вы можете сделать тег "b" аргументом для передачи в список тегов, которые хотите экранировать.
Соответствующий проходной тест JUnit:
@Test
public void testHtmlEscaping() throws Exception {
String source = "This is <b>REALLY</b> dirty code from <a href=\"www.rubbish.url.zzzz\">haxors-r-us</a>";
String expected = "This is <b>REALLY</b> dirty code from \n<a href=\"www.rubbish.url.zzzz\">haxors-r-us</a>";
String transformed = transformer.escapeHtml(source);
assertEquals(transformed, expected);
}
Обратите внимание, что я добавил строку, возвращающую "\ n" перед вашим тегом "a" в "ожидаемой" строке моего теста, потому что JSoup форматирует страницу.