Cách tách hoặc thoát thẻ html trong Android


79

PHP có strip_tagschức năng tách các thẻ HTML và PHP khỏi một chuỗi.

Android có cách nào để thoát html không?

Câu trả lời:


241

Các giải pháp trong câu trả lời được liên kết bởi @sparkymat thường yêu cầu regex - một cách tiếp cận dễ xảy ra lỗi - hoặc cài đặt thư viện của bên thứ ba như jsoup hoặc jericho . Một giải pháp tốt hơn trên các thiết bị Android chỉ là sử dụng hàm Html.fromHtml ():

public String stripHtml(String html) {
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
       return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY).toString();
    } else {
       return Html.fromHtml(html).toString();
    }
}

Điều này sử dụng trình phân tích cú pháp Html được tích hợp sẵn của Android để xây dựng Spannedbiểu diễn của html đầu vào mà không có bất kỳ thẻ html nào. Đánh dấu "Khoảng cách" sau đó bị loại bỏ bằng cách chuyển đổi đầu ra trở lại thành một chuỗi.

Như đã thảo luận ở đây , hành vi Html.fromHtml đã thay đổi kể từ Android N. Xem tài liệu để biết thêm thông tin.


5
Cũng xin lưu ý Html.fromHtml(String)trả lại một lớp mở rộng của CharSequence. Vì vậy, bạn có thể sử dụng nó trực tiếp với các phương thức chấp nhận CharSequencetham số mà không cần gọi toString(). Cảm ơn Nick vì câu trả lời tuyệt vời :-)

4
Bạn cũng có thể sử dụng Html.escapeHtml(String)nếu bạn chỉ muốn thoát khỏi các thẻ mà không cần xóa chúng.
twaddington

1
Tôi nghĩ rằng Phương thức Html.fromHtml (Chuỗi) có giới hạn nhóm hỗ trợ thẻ
Hitesh Chavda

1
Phần đầu html của tôi có html> <head> <style> body {font-family: Verdana, sans-serif; cỡ chữ: 0,8em; màu: # 484848; } h1, h2, h3 {font-family: "Trebuchet MS", Verdana, sans-serif; lề: 0px; } h1 {font-size: 1.2em; } h2, h3 {font-size: 1.1em; } a, a: link, a: đã thăm {color: # 2A5685;} a: hover, a: active {color: # c61a1a; } a.wiki-anchor {display: none; } hr {width: 100%; chiều cao: 1px; nền: #ccc; viền: 0; } .footer {font-size: 0.8em; font-style: nghiêng; } </style> </head> điều này cũng không được xử lý. Làm ơn giúp
png

4
Lưu ý rằng Html.fromHtml(html).toString();loại bỏ nhiều khoảng trắng không phải lúc nào cũng là một lựa chọn tốt.
Buddy

15

Xin lỗi vì bài đăng muộn, nhưng tôi nghĩ điều này có thể giúp ích cho những người khác,

Để chỉ xóa các dải html

Html.fromHtml(htmltext).toString()

Bằng cách này, thẻ html sẽ được thay thế bằng chuỗi, nhưng chuỗi sẽ không được định dạng đúng. Do đó tôi đã làm

Html.fromHtml(htmltext).toString().replaceAll("\n", "").trim()

Bằng cách này, đầu tiên tôi thay thế bằng dòng tiếp theo với khoảng trắng và xóa khoảng trống. Tương tự bạn có thể loại bỏ những người khác.


Tôi cần 4 nhát chém. Xem câu trả lời của Avis: stackoverflow.com/questions/18865393/…
Heinzlmaen

11

Bạn có thể sử dụng cách khác Html.escapeHtml(String)nếu bạn đang nhắm mục tiêu API 16 trở lên.

Đối với việc nhắm mục tiêu bên dưới API 16, thay vào đó bạn có thể sử dụng lớp bên dưới bằng cách gọi lớp HtmlUtils.escapeHtml(String)mà tôi chỉ đơn giản lấy từ nguồn Html.escapeHtml(String).

public class HtmlUtils {

    public static String escapeHtml(CharSequence text) {
        StringBuilder out = new StringBuilder();
        withinStyle(out, text, 0, text.length());
        return out.toString();
    }

    private static void withinStyle(StringBuilder out, CharSequence text,
                                    int start, int end) {
        for (int i = start; i < end; i++) {
            char c = text.charAt(i);

            if (c == '<') {
                out.append("&lt;");
            } else if (c == '>') {
                out.append("&gt;");
            } else if (c == '&') {
                out.append("&amp;");
            } else if (c >= 0xD800 && c <= 0xDFFF) {
                if (c < 0xDC00 && i + 1 < end) {
                    char d = text.charAt(i + 1);
                    if (d >= 0xDC00 && d <= 0xDFFF) {
                        i++;
                        int codepoint = 0x010000 | (int) c - 0xD800 << 10 | (int) d - 0xDC00;
                        out.append("&#").append(codepoint).append(";");
                    }
                }
            } else if (c > 0x7E || c < ' ') {
                out.append("&#").append((int) c).append(";");
            } else if (c == ' ') {
                while (i + 1 < end && text.charAt(i + 1) == ' ') {
                    out.append("&nbsp;");
                    i++;
                }

                out.append(' ');
            } else {
                out.append(c);
            }
        }
    }
}

Tôi đang sử dụng lớp này hoạt động tốt.


4

Đây là phương pháp thay thế mới (API 16+):

android.text.Html.escapeHtml(your_html).toString();

4

Html.fromHtml có thể cực kỳ chậm đối với các chuỗi html lớn.

Đây là cách bạn có thể làm điều đó, dễ dàng và nhanh chóng với jsoup:

Thêm dòng này vào tệp gradle của bạn:

implementation 'org.jsoup:jsoup:1.11.3'

Kiểm tra phiên bản jsoup mới nhất tại đây: https://jsoup.org/download

Thêm dòng này vào mã của bạn:

String text = Jsoup.parse(htmlStr).text();

Kiểm tra liên kết này tại đây để tìm hiểu cách giữ lại ngắt dòng:

Làm cách nào để giữ ngắt dòng khi sử dụng jsoup để chuyển đổi html thành văn bản thuần túy?


2
 Spanned spanned;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
            spanned = Html.fromHtml(textToShare, Html.FROM_HTML_MODE_LEGACY);
        } else {
            spanned = Html.fromHtml(textToShare);
        }
tv.setText(spanned.toString());

2

Điều này thật đơn giản với jsoup

public static String html2text(String html) {
   return Jsoup.parse(html).text();
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.