web-dev-qa-db-fra.com

Comment supprimer ou échapper des balises html dans Android

PHP a strip_tags fonction qui supprime les balises HTML et PHP d'une chaîne.

Android at-il un moyen d'échapper au HTML?

73
Kris

Les solutions dans la réponse liée à @sparkymat nécessitent généralement soit regex - qui est une approche sujette aux erreurs - soit l'installation d'une bibliothèque tierce telle que jsoup ou jericho . Une meilleure solution sur les appareils Android consiste simplement à utiliser la fonction 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();
    }
}

Cela utilise l'analyseur Html intégré d'Android pour construire une représentation Spanned du html d'entrée sans balises html. Le balisage "Span" est ensuite supprimé en convertissant la sortie en une chaîne.

Comme indiqué ici , le comportement de Html.fromHtml a changé depuis Android N. Voir la documentation pour plus d'informations.

226
Nick Street

Désolé pour la publication tardive, mais je pense que cela pourrait aider les autres,

Pour supprimer simplement les bandes html

Html.fromHtml(htmltext).toString()

De cette façon, la balise html sera remplacée par une chaîne, mais la chaîne ne sera pas formatée correctement. C'est pourquoi je l'ai fait

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

De cette façon, je remplace d'abord par la ligne suivante avec un espace vide et un espace vide supprimé. De même, vous pouvez en supprimer d'autres.

12
yubaraj poudel

Vous pouvez également utiliser Html.escapeHtml(String) si vous ciblez l'API 16 ou une version ultérieure.

Pour également cibler en dessous de l'API 16, vous pouvez utiliser à la place la classe ci-dessous en appelant HtmlUtils.escapeHtml(String) que j'ai simplement extraite de la source 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);
            }
        }
    }
}

J'utilise cette classe qui fonctionne bien.

9
Buddy

Html.fromHtml peut être extrêmement lent pour les grandes chaînes html.

Voici comment vous pouvez le faire, facilement et rapidement avec jsoup:

Ajoutez cette ligne à votre fichier gradle:

implementation 'org.jsoup:jsoup:1.11.3'

Vérifiez quelle est la dernière version de jsoup ici: https://jsoup.org/download

Ajoutez cette ligne à votre code:

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

Consultez ce lien ici pour savoir comment conserver les sauts de ligne:

Comment conserver les sauts de ligne lors de l'utilisation de jsoup pour convertir du HTML en texte brut?

4
live-love

C'est pour une nouvelle alternative de méthode (API 16+):

Android.text.Html.escapeHtml(your_html).toString();
3
Tomero Indonesia
 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
Atif Mahmood

C'est très simple avec jsoup

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