PHP có strip_tags
chứ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:
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 Spanned
biể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.
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.
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.
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.
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("<");
} else if (c == '>') {
out.append(">");
} else if (c == '&') {
out.append("&");
} 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(" ");
i++;
}
out.append(' ');
} else {
out.append(c);
}
}
}
}
Tôi đang sử dụng lớp này hoạt động tốt.
Đây là phương pháp thay thế mới (API 16+):
android.text.Html.escapeHtml(your_html).toString();
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?
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());
Điều này thật đơn giản với jsoup
public static String html2text(String html) {
return Jsoup.parse(html).text();
}
Html.fromHtml(String)
trả lại một lớp mở rộng củaCharSequence
. 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ậnCharSequence
tham số mà không cần gọitoString()
. Cảm ơn Nick vì câu trả lời tuyệt vời :-)