web-dev-qa-db-ja.com

Androidでhtmlタグを削除またはエスケープする方法

PHPにはstrip_tags HTMLおよびPHPタグを文字列から削除します。

Androidにはhtmlをエスケープする方法がありますか?

73
Kris

@sparkymatにリンクされた回答のソリューションには、通常、正規表現(エラーが発生しやすい方法)または jsoupjericho などのサードパーティライブラリのインストールが必要です。 Androidデバイスのより良い解決策は、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();
    }
}

これは、Androidに組み込まれたHtmlパーサーを使用して、htmlタグなしで入力htmlのSpanned表現を構築します。次に、出力を文字列に戻すことにより、「スパン」マークアップが削除されます。

here で説明したように、Html.fromHtmlの動作はAndroid Nから変更されました。詳細については documentation を参照してください。

226
Nick Street

投稿が遅れて申し訳ありませんが、これは他の人の助けになると思います。

HTMLストリップを削除するだけ

Html.fromHtml(htmltext).toString()

この方法では、htmlタグは文字列に置き換えられますが、文字列は適切にフォーマットされません。したがって、私はやった

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

この方法で、最初に空白のある次の行に置き換えて、空白を削除します。同様に、他のものを削除できます。

12
yubaraj poudel

API 16以上をターゲットにしている場合は、代わりにHtml.escapeHtml(String)を使用することもできます。

API 16以下をターゲットにする場合は、代わりにHtmlUtils.escapeHtml(String)を呼び出して以下のクラスを使用し、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);
            }
        }
    }
}

私は正常に動作するこのクラスを使用しています。

9
Buddy

Html.fromHtmlは、大きなhtml文字列に対して非常に遅くなる可能性があります。

Jsoupを使用すると、簡単かつ迅速に実行できます。

次の行をgradleファイルに追加します。

implementation 'org.jsoup:jsoup:1.11.3'

最新のjsoupバージョンを確認してください: https://jsoup.org/download

コードに次の行を追加します。

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

改行を保持する方法については、こちらのリンクをご覧ください。

jsoupを使用してhtmlをプレーンテキストに変換するときに改行を保持するにはどうすればよいですか?

4
live-love

これは、新しいメソッドの代替(API 16以降)用です。

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

これは jsoup で非常に簡単です

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