2011-10-13 27 views
8

Có cách nào để nhận jsoup để xóa chuỗi có HTML trong đó bằng cách thoát HTML không mong muốn thay vì xóa hoàn toàn không? ví dụ của tôi:Jsoup - Làm thế nào để xóa sạch html bằng cách thoát không xóa html không mong muốn?

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

này đưa ra một "sạch" chuỗi:

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

Những gì tôi muốn là "sạch" chuỗi là:

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

Đẹp nhất. Không, Jsoup không ủng hộ nó. Bạn có thể muốn đăng yêu cầu tính năng tại https://github.com/jhy/jsoup/issues để thêm phương thức mới vào API 'Whitelist' có thể chuyển HTML thành HTML thoát. – BalusC

+0

Yêu cầu tính năng đã đăng: https://github.com/jhy/jsoup/issues/515 –

Trả lời

3

Giả sử chuỗi chứ không phải Tài liệu HTML đang được phân tích cú pháp (theo câu hỏi của bạn) phương pháp này sẽ hoạt động:

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ạn có thể đặt thẻ "b" thành đối số để chuyển vào danh sách các thẻ bạn muốn thoát.

Các thử nghiệm qua JUnit liên quan:

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

Lưu ý rằng tôi đã thêm một dòng trở lại "\ n" trước khi "một" thẻ của bạn trong "dự kiến" Chuỗi thử nghiệm của tôi vì JSoup định dạng trang.

Các vấn đề liên quan