Android에서 HTML 태그를 제거하거나 이스케이프하는 방법


81

PHP에는 strip_tags문자열에서 HTML 및 PHP 태그를 제거하는 기능이 있습니다.

Android에 html을 이스케이프 할 수있는 방법이 있습니까?

답변:


242

@sparkymat에 연결된 답변의 솔루션에는 일반적으로 오류가 발생하기 쉬운 접근 방식 인 regex 또는 jsoup 또는 jericho 와 같은 타사 라이브러리 설치가 필요합니다 . 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 파서를 사용하여 Spannedhtml 태그없이 입력 html 의 표현 을 빌드 합니다. 그런 다음 출력을 다시 문자열로 변환하여 "Span"마크 업을 제거합니다.

여기 에 설명 된대로 Html.fromHtml 동작은 Android N 이후로 변경되었습니다. 자세한 내용은 문서 를 참조하세요.


5
또한 Html.fromHtml(String)의 확장 클래스를 반환 하십시오 CharSequence. 따라서을 CharSequence호출하지 않고 매개 변수 를받는 메소드와 함께 직접 사용할 수 있습니다 toString(). 감사합니다 좋은 답변 닉 :-)

4
Html.escapeHtml(String)태그를 제거하지 않고 이스케이프하려는 경우 에도 사용할 수 있습니다 .
twaddington

1
나는 Html.fromHtml (String) 메서드가 제한된 태그 지원 세트를 가지고 있다고 생각합니다
Hitesh Chavda

1
내 html 머리에는 html> <head> <style> body {font-family : Verdana, sans-serif; 글꼴 크기 : 0.8em; 색상 : # 484848; } h1, h2, h3 {글꼴 계열 : "Trebuchet MS", Verdana, sans-serif; 여백 : 0px; } h1 {글꼴 크기 : 1.2em; } h2, h3 {글꼴 크기 : 1.1em; } a, a : link, a : visited {color : # 2A5685;} a : hover, a : active {color : # c61a1a; } a.wiki-anchor {표시 : 없음; } hr {너비 : 100 %; 높이 : 1px; 배경 : #ccc; 경계 : 0; } .footer {글꼴 크기 : 0.8em; 글꼴 스타일 : 기울임 꼴; } </ style> </ head> 이것도 처리되지 않습니다. Pls help
png

4
Html.fromHtml(html).toString();항상 좋은 선택이 아닌 여러 공백 을 제거합니다.
Buddy

15

늦은 게시물에 대해 죄송하지만 다른 사람에게 도움이 될 것 같습니다.

html 스트립 만 제거하려면

Html.fromHtml(htmltext).toString()

이렇게하면 html 태그가 문자열로 대체되지만 문자열 형식이 제대로 지정되지 않습니다. 따라서 나는했다

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

이런 식으로 먼저 다음 줄을 공백으로 바꾸고 공백을 제거했습니다. 마찬가지로 다른 항목을 제거 할 수 있습니다.


4 개의 슬래시가 필요했습니다. Avis 답변 참조 : stackoverflow.com/questions/18865393/…
Heinzlmaen

11

Html.escapeHtml(String)API 16 이상을 대상으로 하는 경우 대신 사용할 수 있습니다 .

또한 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);
            }
        }
    }
}

나는 잘 작동하는이 수업을 사용하고 있습니다.


4

이것은 새로운 방법 대안 (API 16+)을위한 것입니다.

android.text.Html.escapeHtml(your_html).toString();

4

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을 일반 텍스트로 변환 할 때 줄 바꿈을 어떻게 유지합니까?


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());


0

아직 언급되지 않았기 때문에 이전 버전과 호환되는 방식으로이 작업을 수행하는 방법은 HtmlCompat 유틸리티 클래스 를 사용 하고 단순히 호출하는 것입니다 (특정 플래그를 사용할 필요가없는 경우 0으로).

HtmlCompat.from(inputString, 0).toString()

내부적으로는 이미 필요한 모든 API 검사를 수행합니다.

if (Build.VERSION.SDK_INT >= 24) {
   return Html.fromHtml(source, flags);
}
return Html.fromHtml(source);

따라서 입력을 위해

<a href="https://www.stackoverflow.com">Click me!</a>

'Click me!'라는 문자열 만 받게됩니다. 출력으로.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.