2011-09-08 34 views
5

Tôi muốn xóa thẻ HTML khỏi chuỗi. này rất dễ dàng, tôi biết, tôi đã làm như vậy:Xóa một số thẻ HTML bằng RegExp và Java

public String removerTags(String html) 
    { 
     return html.replaceAll("\\<(/?[^\\>]+)\\>", " ").replaceAll("\\s+", " ").trim(); 
    } 

Vấn đề là tôi không muốn để loại bỏ tất cả các thẻ .. Tôi muốn tag

<span style=\"background-color: yellow\"> (text) </ span> 

nghỉ còn nguyên vẹn trong chuỗi ..

tôi đang sử dụng điều này như một loại "nổi bật" trong việc tìm kiếm một ứng dụng web sử dụng GWT tôi đang làm ...

Và tôi cần phải làm điều này, bởi vì nếu tìm kiếm tìm thấy te xt có chứa một số thẻ HTML (việc lập chỉ mục được thực hiện bởi Lucene), và nó bị hỏng, appendHTML từ safeHTMLBuilder không thể gắn một String.

Bạn có thể làm điều này theo cách khá tốt?

Hugs.

+1

Những câu hỏi rất thường xuyên những ngày này. Tại sao chúng ta không thể nhóm các câu hỏi tương tự lại với nhau? * # SO tip *;) –

+0

đó là người đàn ông đích thực. – caarlos0

+0

Đảm bảo bạn cũng tính đến các giá trị tham chiếu đối tượng. – Edward

Trả lời

4

Tôi đề nghị bạn sử dụng JSoup cho tác vụ này. Cụm từ thông dụng đơn giản là không phù hợp với tác vụ này. Và với JSoup, điều này về cơ bản là một lớp lót đơn giản, dễ đọc và dễ bảo trì!

Có xem xét phương pháp JSoup.clean, và có lẽ bài viết này:

+0

sẽ xóa tất cả các thẻ HTML của tôi. – caarlos0

+0

Ồ không ... bạn có thể cung cấp phương pháp với danh sách thẻ trắng mà bạn không muốn nó can thiệp. – aioobe

+0

hmmm, tôi sẽ thử ... – caarlos0

0

Một thư viện tôi đã sử dụng có hiệu quả lớn trong quá khứ là OWASP AntiSamy

này chắc chắn cho phép danh sách trắng/danh sách cấm các thẻ. Nó có thể đáng xem.

+0

jsoup có vẻ tốt hơn .. – caarlos0

+0

Cảm ơn, tôi sẽ ghi nhớ điều đó trong lần sau tôi cần làm điều này. – extorn

1

Tôi tìm thấy một giải pháp cho vấn đề này chỉ sử dụng biểu thức thông thường:

public static String filterHTMLTags(String html) { 

    // save valid tags: 
    String striped = html.replaceAll("(?i)\\<(\\s*/?(a|h\\d|b|i|em|cite|code|strong|pre|br).*?/?)\\>", "{{$1}}"); 
    // remove all tags: 
    striped = striped.replaceAll("\\<(/?[^\\>]+)\\>", " "); 
    // restore valid tags: 
    striped = striped.replaceAll("\\{\\{(.+?)\\}\\}", "<$1>"); 

    return striped; 
} 

Hãy chắc chắn rằng bạn không sử dụng "{{...}}" trong nội dung html của bạn. Bạn có thể thay đổi "lưu chuỗi" một cách dễ dàng. Các thẻ hợp lệ được định nghĩa trong danh sách các replaceAll đầu tiên biểu thức chính quy:

(a | h \ d | b | i | em | trích dẫn | đang | mạnh | trước | BR)

Các "h \ d" trong danh sách trên có nghĩa là "h1, h2, ..." là các thẻ hợp lệ.

Tôi thử nghiệm này với mã này:

public static void main (String[] args) { 

    String teste = " <b>test bold chars</b> <BR/> <div>test div</div> \n" + 
      " link: <a href=\"test.html\">click here</a> <br />\n" + 
      " <script>bad script</script> <notpermitted/>\n"; 

    System.out.println("teste: \n"+teste); 
    System.out.println("\n\n\nstriped: \n"+filterHTMLTags(teste)); 
} 

Bye, Sergio Figueiredo - My blog

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