Jsoup - Как очистить HTML, избегая не удаляя нежелательный HTML? - PullRequest
8 голосов
/ 13 октября 2011

Есть ли способ заставить jsoup очистить строку с HTML в ней, избегая нежелательного HTML, вместо полного его удаления? Мой пример:

String dirty = "This is <b>REALLY</b> dirty code from <a href="www.rubbish.url.zzzz">haxors-r-us</a>
String clean = Jsoup.clean(dirty, new Whitelist().addTags("a").addAttributes("a", "href", "name", "rel", "target"));

Это дает "чистую" строку:

This is    REALLY    dirty code from <a href="www.rubbish.url.zzzz">haxors-r-us</a>

Я хочу, чтобы «чистая» строка была:

"This is &lt;b&gt;REALLY&lt;/b&gt; dirty code from <a href="www.rubbish.url.zzzz">haxors-r-us</a>

1 Ответ

3 голосов
/ 22 января 2012

Предполагается, что анализируются строки, а не документы 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 &lt;b&gt;REALLY&lt;/b&gt; 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 форматирует страницу.

...