2009-11-09 56 views
10

Có cụm từ thông dụng nào có thể xóa hoàn toàn thẻ HTML không? Nhân tiện, tôi đang sử dụng Java.Cách xóa thẻ HTML trong Java

+2

Gõ tiêu đề của bạn vào hộp tìm kiếm, tôi đã nhận như sau: http://stackoverflow.com/search?q=How+to+remove+HTML+tag + trong + Java ... bạn đã không nhận được như vậy trong khi bạn đã đăng câu hỏi? – kdgregory

+2

Tôi không tìm thấy bản sao nào. Những câu hỏi này quan tâm đến việc trích xuất văn bản từ HTML: http://stackoverflow.com/questions/240546/removing-html-from-a-java-string http: // stackoverflow.com/questions/832620/stripping-html-tags-in-java – tangens

Trả lời

20

Thay vào đó, bạn nên sử dụng trình phân tích cú pháp HTML. Tôi thích htmlCleaner, vì nó mang lại cho tôi phiên bản HTML được in đẹp mắt.

Với htmlCleaner bạn có thể làm:

TagNode root = htmlCleaner.clean(stream); 
Object[] found = root.evaluateXPath("//div[id='something']"); 
if(found.length > 0 && found instanceof TagNode) { 
    ((TagNode)found[0]).removeFromTree(); 
} 
+0

Cảm ơn bạn đã chỉ cho tôi tới htmlCleaner :) – exhuma

+0

Chúng tôi có cần bất kỳ thư viện nào để sử dụng mã trên không? Và root.evaluateXPath ("// div [id = 'something']"); trong "cái gì đó" này có thể là nghi thức id? làm ơn cho tôi biết. thanks –

4

số biểu thức chính quy không có thể bằng HTML định nghĩa phân tích cú pháp.

Bạn có thể sử dụng regex đến s/<[^>]*\>// hoặc thứ gì đó ngây thơ như vậy nhưng sẽ không đủ, đặc biệt nếu bạn quan tâm đến việc xóa nội dung của thẻ.

Khi một người đăng khác nói, hãy sử dụng trình phân tích cú pháp HTML thực tế.

4

Nếu bạn chỉ cần loại bỏ các thẻ sau đó bạn có thể sử dụng biểu thức chính quy này:

content = content.replaceAll("<[^>]+>", ""); 

Nó sẽ loại bỏ chỉ thẻ, nhưng không phải thứ HTML khác. Đối với những điều phức tạp hơn, bạn nên sử dụng phân tích cú pháp.

EDIT: Để tránh các vấn đề với HTML bình luận của bạn có thể làm như sau:

content = content.replaceAll("<!--.*?-->", "").replaceAll("<[^>]+>", ""); 
+0

Vì bạn không sử dụng bất kỳ ký tự thịt '.','^'và' $ ', các cờ' s'- và 'm' có thể được bỏ qua. –

+0

Regex này chịu trách nhiệm gây xâu chuỗi nếu HTML chứa nhận xét XML có các ký tự '<' or '>' được nhúng. –

0

Ngoài ra, nếu mục đích của bạn là để hiển thị người dùng kiểm soát đầu vào lại cho khách hàng, sau đó bạn cũng có thể chỉ cần thay thế tất cả < bởi &lt; và tất cả > theo &gt;. Bằng cách này, HTML sẽ không được hiểu là do ứng dụng của khách hàng (trình duyệt web).

Nếu bạn đang sử dụng JSP làm công nghệ xem, thì bạn có thể sử dụng JSTL's c:out cho việc này. Nó sẽ thoát khỏi tất cả các thực thể HTML theo mặc định. Vì vậy, ví dụ:

<c:out value="<script>alert('XSS');</script>" /> 

sẽ KHÔNG hiển thị cảnh báo, nhưng chỉ hiển thị chuỗi thực tế.

0

bạn có thể sử dụng mã đơn giản này để loại bỏ tất cả các thẻ html ...

htmlString.replaceAll("\\<.*?\\>", "")) 
+1

Thao tác này sẽ chỉ xóa thẻ mở và để thẻ đóng bị hủy. – jlordo

+0

Tôi sẽ không bao giờ làm một công việc như vậy - phân tích cú pháp html thành văn bản thuần túy thực sự là công việc mặc dù .. – jebbie

+0

Nó làm việc cho tôi nhưng có thể phụ thuộc vào độ phức tạp của thẻ, chú thích, tập lệnh, v.v. cho một trường hợp phức tạp có thể là một thư viện html nên được tốt hơn. – jmoran

16

JSoup mà là một thư viện java làm cho thao tác HTML. Nhìn vào phương pháp clean() và đối tượng WhiteList. Dễ sử dụng giải pháp!

+2

WOW, thưa bạn, thực sự làm cho ngày của tôi, tôi thích điều đó, CÓ! Markdownj, Markdown4J, htmlCleaner .. tất cả trong số họ là ***** xin lỗi .. JSoup là một và chỉ nơi bạn thực sự đạt được điều đó với một lớp lót: Chuỗi plain = new HtmlToPlainText(). GetPlainText (Jsoup.parse (html)); – jebbie

+4

Mã ngắn hơn sẽ là 'Chuỗi văn bản thuần túy = Jsoup.parse (html) .text();' – jrarama

+2

@jrarama - Không hề. 'Jsoup.parse (html) .text()' xóa tất cả các thẻ và khoảng trống, để lại cho bạn một dòng văn bản dài duy nhất, trong khi 'new HtmlToPlainText(). GetPlainText (Jsoup.parse (html))' định dạng văn bản một cách đơn giản, giữ ngắt dòng, đoạn văn, dấu đầu dòng, v.v. – isapir

1

Bạn không cần bất kỳ trình phân tích cú pháp HTML nào. Mã dưới đây loại bỏ tất cả các bình luận HTML:

htmlString = htmlString.replaceAll("(?s)<!--.*?-->", "");

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