PHP tiene una strip_tags
función que elimina las etiquetas HTML y PHP de una cadena.
¿Tiene Android una forma de escapar de html?
Respuestas:
Las soluciones en la respuesta vinculada por @sparkymat generalmente requieren regex, que es un enfoque propenso a errores, o la instalación de una biblioteca de terceros como jsoup o jericho . Una mejor solución en dispositivos Android es simplemente hacer uso de la función 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();
}
}
Esto utiliza el analizador Html integrado de Android para crear una Spanned
representación del html de entrada sin etiquetas html. El marcado "Span" luego se elimina convirtiendo la salida nuevamente en una cadena.
Como se discutió aquí , el comportamiento de Html.fromHtml ha cambiado desde Android N. Consulte la documentación para obtener más información.
Html.escapeHtml(String)
si solo desea escapar de las etiquetas sin eliminarlas.
Html.fromHtml(html).toString();
elimina varios espacios, lo que no siempre es una buena opción.
Perdón por la publicación tardía, pero creo que esto podría ayudar a otros,
Para eliminar simplemente las tiras html
Html.fromHtml(htmltext).toString()
De esta manera, la etiqueta html se reemplazará con una cadena, pero la cadena no se formateará correctamente. Por eso lo hice
Html.fromHtml(htmltext).toString().replaceAll("\n", "").trim()
De esta manera, primero reemplazo con nextline con espacios en blanco y elimino el espacio en blanco. Del mismo modo, puede eliminar otros.
Alternativamente, puede usar Html.escapeHtml(String)
si su objetivo es API 16 o superior.
Para apuntar también por debajo de API 16, en su lugar puede usar la clase a continuación llamando a la HtmlUtils.escapeHtml(String)
que simplemente extraje de la fuente de 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);
}
}
}
}
Estoy usando esta clase que funciona bien.
Esto es para una nueva alternativa de método (API 16+):
android.text.Html.escapeHtml(your_html).toString();
Html.fromHtml puede ser extremadamente lento para cadenas html grandes.
Así es como puede hacerlo, fácil y rápido con jsoup:
Agregue esta línea a su archivo gradle:
implementation 'org.jsoup:jsoup:1.11.3'
Compruebe cuál es la última versión de jsoup aquí: https://jsoup.org/download
Agrega esta línea a tu código:
String text = Jsoup.parse(htmlStr).text();
Consulte este enlace aquí para aprender cómo conservar los saltos de línea:
¿Cómo conservo los saltos de línea cuando uso jsoup para convertir HTML a texto sin formato?
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());
Esto es muy simple con jsoup
public static String html2text(String html) {
return Jsoup.parse(html).text();
}
Como aún no se ha mencionado, la forma de hacer esto de una manera compatible con versiones anteriores sería usar la clase de utilidad HtmlCompat y simplemente llamar (con 0 si no requiere que se usen indicadores específicos)
HtmlCompat.from(inputString, 0).toString()
Debajo del capó ya hace todas las comprobaciones de API necesarias para usted
if (Build.VERSION.SDK_INT >= 24) {
return Html.fromHtml(source, flags);
}
return Html.fromHtml(source);
Entonces para la entrada
<a href="https://www.stackoverflow.com">Click me!</a>
Recibirá solo la cadena "¡Haga clic en mí!" como salida.
Html.fromHtml(String)
devolver una clase extendida deCharSequence
. Entonces puede usarlo directamente con métodos que aceptenCharSequence
parámetros, sin llamartoString()
. Gracias Nick por la gran respuesta :-)