Cómo quitar o escapar de las etiquetas html en Android

81

PHP tiene una strip_tagsfunción que elimina las etiquetas HTML y PHP de una cadena.

¿Tiene Android una forma de escapar de html?

Kris
fuente

Respuestas:

242

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 Spannedrepresentació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.

Nick Street
fuente
5
También tenga en cuenta Html.fromHtml(String)devolver una clase extendida de CharSequence. Entonces puede usarlo directamente con métodos que acepten CharSequenceparámetros, sin llamar toString(). Gracias Nick por la gran respuesta :-)
4
También puede usarlo Html.escapeHtml(String)si solo desea escapar de las etiquetas sin eliminarlas.
twaddington
1
Creo que el método Html.fromHtml (String) tiene conjuntos limitados de compatibilidad con etiquetas
Hitesh Chavda
1
Mi encabezado html tiene html> <head> <style> body {font-family: Verdana, sans-serif; tamaño de fuente: 0.8em; color: # 484848; } h1, h2, h3 {familia de fuentes: "Trebuchet MS", Verdana, sans-serif; margen: 0px; } h1 {tamaño de fuente: 1.2em; } h2, h3 {tamaño de fuente: 1.1em; } a, a: link, a: visitado {color: # 2A5685;} a: hover, a: active {color: # c61a1a; } a.wiki-anchor {display: none; } hr {ancho: 100%; altura: 1px; fondo: #ccc; borde: 0; } .footer {tamaño de fuente: 0.8em; estilo de fuente: cursiva; } </style> </head> esto tampoco se está manejando. Pls ayuda
png
4
Tenga en cuenta que Html.fromHtml(html).toString();elimina varios espacios, lo que no siempre es una buena opción.
Buddy
15

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.

Yubaraj poudel
fuente
Necesitaba 4 barras. Consulte la respuesta de Avis: stackoverflow.com/questions/18865393/…
Heinzlmaen
11

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("&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);
            }
        }
    }
}

Estoy usando esta clase que funciona bien.

compañero
fuente
4

Esto es para una nueva alternativa de método (API 16+):

android.text.Html.escapeHtml(your_html).toString();
Tomero Indonesia
fuente
4

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?

vive el amor
fuente
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());
Atif Mahmood
fuente
2

Esto es muy simple con jsoup

public static String html2text(String html) {
   return Jsoup.parse(html).text();
}
Jayakrishnan
fuente
0

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.

Hrafn
fuente