2011-10-13 17 views
8

Czy istnieje sposób, aby jsoup wyczyścił ciąg znaków przy użyciu kodu HTML, uciekając przed niepożądanym kodem HTML zamiast go całkowicie usunąć? Mój przykład:Jsoup - Howto clean html przez ucieczkę, nie usuwając niechcianego 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")); 

To daje "czysty" ciąg:

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

Co ja chcąc jest "czysty" łańcuch być:

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

Niezły. Nie, Jsoup go nie obsługuje. Możesz wysłać wiadomość o funkcji na stronie https://github.com/jhy/jsoup/issues, aby dodać nową metodę do interfejsu API "Biała lista", która może spowodować usunięcie kodu HTML do przechodzenia HTML. – BalusC

+0

Wysłano żądanie funkcji: https://github.com/jhy/jsoup/issues/515 –

Odpowiedz

3

Zakładając String zamiast Dokumenty HTML są przetwarzane (zgodnie z pytaniem) ta metoda będzie działać:

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")); 
} 

Możesz uczynić tag "b" argumentem do przekazania na liście tagów, które chcesz uciec.

Związane testy JUnit mijania:

@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); 
} 

Zauważ, że dodałem powrotu linii „\ n” przed swoim „a” tag „oczekiwanej” ciąg mojego testu, ponieważ JSoup formatuje stronę.