एंड्रॉइड में HTML टैग्स को कैसे पट्टी या बचाना है


81

PHP में strip_tagsफ़ंक्शन होता है जो HTML और PHP टैग को एक स्ट्रिंग से स्ट्रिप्स करता है।

क्या एंड्रॉइड के पास 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();
    }
}

यह Spannedबिना किसी HTML टैग के इनपुट HTML का प्रतिनिधित्व बनाने के लिए एंड्रॉइड के एचटीएमएल पार्सर में निर्मित का उपयोग करता है । फिर "स्पैन" मार्कअप को आउटपुट को एक स्ट्रिंग में परिवर्तित करके छीन लिया जाता है।

जैसा कि यहां चर्चा की गई है , एंड्रॉइड एन के बाद से Html.fromHtml व्यवहार बदल गया है। अधिक जानकारी के लिए दस्तावेज़ देखें ।


5
कृपया Html.fromHtml(String)एक विस्तारित वर्ग को भी वापस करें CharSequence। तो आप इसे CharSequenceबिना मापदंडों के स्वीकार करने के तरीकों के साथ सीधे उपयोग कर सकते हैं toString()। महान उत्तर के लिए धन्यवाद Nick :-)

4
आप उपयोग कर सकते हैं Html.escapeHtml(String)यदि आप उन्हें हटाए बिना केवल टैग से बचना चाहते हैं।
ट्विडिंगटन

1
मुझे लगता है कि Html.fromHtml (स्ट्रिंग) विधि में टैग समर्थन के सीमित सेट हैं
हितेश चावड़ा

1
मेरे HTML हेड में html> <head> <style> body {font-family: Verdana, sans-serif; फ़ॉन्ट-आकार: 0.8em; रंग: # 484848; } h1, h2, h3 {font-family: "Trebuchet MS", Verdana, sans-serif; मार्जिन: 0px; } h1 {फ़ॉन्ट-आकार: 1.2em; } h2, h3 {फ़ॉन्ट-आकार: 1.1em; } a, a: लिंक, a: दौरा किया {color: # 2A5685;} a: hover, a: active {color: # c61a1a; } a.wiki-anchor {प्रदर्शन: कोई नहीं; } hr {चौड़ाई: 100%; ऊंचाई: 1 पीएक्स; पृष्ठभूमि: #ccc; सीमा: 0; } .footer {font-size: 0.8em; फ़ॉन्ट-शैली: इटैलिक; } </ style> </ head> यह भी संभाला नहीं जा रहा है। Pls मदद
पीएनजी

4
ध्यान दें कि Html.fromHtml(html).toString();कई रिक्त स्थान निकालता है जो हमेशा एक अच्छा विकल्प नहीं होता है।
बडी

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)यदि आप एपीआई 16 या इसके बाद के संस्करण को लक्षित कर रहे हैं।

एपीआई 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

Html.fromHtml बड़े html स्ट्रिंग्स के लिए बेहद धीमी हो सकती है।

यहां बताया गया है कि आप इसे कैसे कर सकते हैं, आसानी से और तेजी से jsoup के साथ:

इस रेखा को अपनी श्रेणी फ़ाइल में जोड़ें:

implementation 'org.jsoup:jsoup:1.11.3'

जाँचें कि नवीनतम jsoup संस्करण यहाँ क्या है: https://jsoup.org/download

इस लाइन को अपने कोड में जोड़ें:

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

लाइन ब्रेक को संरक्षित करने के तरीके जानने के लिए इस लिंक को यहाँ देखें:

HTML को सादे पाठ में बदलने के लिए jsoup का उपयोग करते समय मैं रेखा को कैसे संरक्षित करता हूं?


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

जैसा कि अभी तक इसका उल्लेख नहीं किया गया है, इसे पीछे की ओर से संगत तरीके से करने का तरीका एचटीएमएल कॉमपिट यूटिलिटी क्लास का उपयोग करना होगा , और बस कॉल करना होगा (0 के साथ यदि आपको किसी विशिष्ट झंडे का उपयोग करने की आवश्यकता नहीं है)

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

हुड के तहत यह पहले से ही आपके लिए सभी आवश्यक एपीआई जांच करता है

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

तो इनपुट के लिए

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

आपको केवल स्ट्रिंग मिलेगी 'मुझे क्लिक करें!' आउटपुट के रूप में।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.