C # में स्ट्रिंग सहित HTML टैग निकालें


83

मैं C # में regex का उपयोग करके & nbsp सहित सभी HTML टैग कैसे निकाल सकता हूं। मेरा स्ट्रिंग दिखता है

  "<div>hello</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>"

9
एक रेगेक्स का उपयोग न करें, HTML चपलता पैक देखें। stackoverflow.com/questions/846994/how-to-use-html-agility-pack
टिम

धन्यवाद टिम, लेकिन एक html चपलता पैक को जोड़ने या डाउनलोड करने के लिए एप्लिकेशन काफी बड़ा और बरकरार है, काम नहीं करेगा।
रामपुरिया

जवाबों:


196

यदि आप टैग्स को फ़िल्टर करने के लिए HTML पार्सर उन्मुख समाधान का उपयोग नहीं कर सकते हैं, तो इसके लिए एक सरल रेगेक्स है।

string noHTML = Regex.Replace(inputHTML, @"<[^>]+>|&nbsp;", "").Trim();

आपको आदर्श रूप से regex फ़िल्टर के माध्यम से एक और पास बनाना चाहिए जो कई स्थानों का ध्यान रखता है

string noHTMLNormalised = Regex.Replace(noHTML, @"\s{2,}", " ");

मैंने अभी तक इसका परीक्षण नहीं किया है जितना मुझे इसकी आवश्यकता होगी, लेकिन इसने मेरे काम करने की अपेक्षा से बेहतर काम किया। मैं नीचे लिखी विधि पोस्ट करूँगा।
डॉन रोलिंग

एक आलसी मैच ( <[^>]+?>@ दाविद एस। के अनुसार) यह तेजी से एक बालक बना सकता है, लेकिन बस एक लाइव प्रोजेक्ट में इस समाधान का उपयोग किया - बहुत खुश +1 :)
कोडिंग

Regex.Replace (inputHTML, @ "<[^>] +> | & nbsp; \ n;", "") .Trim (); \ n हटाया नहीं जा रहा है
महेश मालपानी

3
मैं एक खाली स्ट्रिंग के बजाय एक स्थान का विज्ञापन करने की सलाह दूंगा, हम किसी भी तरह से अतिरिक्त स्थानों को पकड़ रहे हैंRegex.Replace(inputHTML, @"<[^>]+>|&nbsp;", " ")
Toseef

2
यदि आप पहली जगह में कॉल का उपयोग करते हैं, तो आप उन रिक्त स्थान को छोड़ सकते हैं जहां मूल इनपुट में कोई भी नहीं था। कहते हैं कि आप Sound<b>Cloud</b>एक इनपुट के रूप में प्राप्त करते हैं ; Sound Cloudजब तक इसे SoundCloudHTML में प्रदर्शित नहीं किया जाता है, तब तक इसे समाप्त कर दिया जाना चाहिए, क्योंकि आप इसे समाप्त कर देंगे ।
रवि थपलियाल

31

मैंने @ रावी थपलियाल का कोड लिया और एक विधि बनाई: यह सरल है और शायद सब कुछ साफ नहीं हो सकता है, लेकिन अभी तक यह वही कर रहा है जो मुझे करने की आवश्यकता है।

public static string ScrubHtml(string value) {
    var step1 = Regex.Replace(value, @"<[^>]+>|&nbsp;", "").Trim();
    var step2 = Regex.Replace(step1, @"\s{2,}", " ");
    return step2;
}

16

मैं कुछ समय से इस फ़ंक्शन का उपयोग कर रहा हूं। बहुत अधिक किसी भी गंदे HTML को हटाता है जिसे आप इस पर फेंक सकते हैं और पाठ को बरकरार रख सकते हैं।

        private static readonly Regex _tags_ = new Regex(@"<[^>]+?>", RegexOptions.Multiline | RegexOptions.Compiled);

        //add characters that are should not be removed to this regex
        private static readonly Regex _notOkCharacter_ = new Regex(@"[^\w;&#@.:/\\?=|%!() -]", RegexOptions.Compiled);

        public static String UnHtml(String html)
        {
            html = HttpUtility.UrlDecode(html);
            html = HttpUtility.HtmlDecode(html);

            html = RemoveTag(html, "<!--", "-->");
            html = RemoveTag(html, "<script", "</script>");
            html = RemoveTag(html, "<style", "</style>");

            //replace matches of these regexes with space
            html = _tags_.Replace(html, " ");
            html = _notOkCharacter_.Replace(html, " ");
            html = SingleSpacedTrim(html);

            return html;
        }

        private static String RemoveTag(String html, String startTag, String endTag)
        {
            Boolean bAgain;
            do
            {
                bAgain = false;
                Int32 startTagPos = html.IndexOf(startTag, 0, StringComparison.CurrentCultureIgnoreCase);
                if (startTagPos < 0)
                    continue;
                Int32 endTagPos = html.IndexOf(endTag, startTagPos + 1, StringComparison.CurrentCultureIgnoreCase);
                if (endTagPos <= startTagPos)
                    continue;
                html = html.Remove(startTagPos, endTagPos - startTagPos + endTag.Length);
                bAgain = true;
            } while (bAgain);
            return html;
        }

        private static String SingleSpacedTrim(String inString)
        {
            StringBuilder sb = new StringBuilder();
            Boolean inBlanks = false;
            foreach (Char c in inString)
            {
                switch (c)
                {
                    case '\r':
                    case '\n':
                    case '\t':
                    case ' ':
                        if (!inBlanks)
                        {
                            inBlanks = true;
                            sb.Append(' ');
                        }   
                        continue;
                    default:
                        inBlanks = false;
                        sb.Append(c);
                        break;
                }
            }
            return sb.ToString().Trim();
        }

बस पुष्टि करने के लिए: SingleSpacedTrim () फ़ंक्शन स्ट्रिंग noHTMLNormalised = Regex.Replace (noHTML, @ "\ _ s {2,}", "") के समान कार्य करता है; रवि थपलियाल के जवाब से?
जिमी

@ जिमी जहाँ तक मैं देख सकता हूँ, कि रेगेक्स सिंगल टैब या न्यूस्पील्स को नहीं पकड़ता है, जैसे कि सिंगलस्पीडट्रिम () करता है। यह एक वांछनीय प्रभाव हो सकता है, हालांकि उस स्थिति में केवल आवश्यकतानुसार मामलों को हटा दें।
डेविड एस।

अच्छा लगा, लेकिन यह सिंगल और डबल कोट्स को रिक्त स्थान के साथ-साथ बदलने लगता है, हालांकि वे " notOkCharacter " सूची में नहीं हैं, या क्या मैं वहां कुछ याद कर रहा हूं? क्या यह डिकोडिंग / एन्कोडिंग मीथोड्स का हिस्सा है जिसे शुरुआत में कहा जाता है? इन चरित्रों को अक्षुण्ण रखने के लिए क्या आवश्यक होगा?
vm370


1

मैंने @RaviThapliyal & @Don Rolling के कोड का उपयोग किया है लेकिन थोड़ा संशोधन किया है। चूंकि हम खाली स्ट्रिंग के साथ & nbsp की जगह ले रहे हैं, लेकिन इसकी जगह & nbsp को स्थान से बदलना चाहिए, इसलिए एक अतिरिक्त चरण जोड़ा गया। इसने मेरे लिए एक आकर्षण की तरह काम किया।

public static string FormatString(string value) {
    var step1 = Regex.Replace(value, @"<[^>]+>", "").Trim();
    var step2 = Regex.Replace(step1, @"&nbsp;", " ");
    var step3 = Regex.Replace(step2, @"\s{2,}", " ");
    return step3;
}

सेमीकॉलन के बिना प्रयुक्त और nbps क्योंकि यह स्टैक ओवरफ्लो द्वारा स्वरूपित हो रहा था।


0

यह:

(<.+?> | &nbsp;)

किसी भी टैग से मेल खाएगा या &nbsp;

string regex = @"(<.+?>|&nbsp;)";
var x = Regex.Replace(originalString, regex, "").Trim();

तो x = hello


0

Html डॉक्यूमेंट को सैनिटाइज करने में बहुत सारी पेचीदा चीजें शामिल हैं। यह पैकेज शायद मदद के लिए: https://github.com/mganss/HtmlSanitizer


मुझे लगता है कि यह html को सामान्य करने की तुलना में फिर से XSS हमले है
स्पष्ट रूप

1
@ स्पष्ट मुझे लगता है कि आप सही हैं। शायद मेरा जवाब ओपी के सवाल से ज्यादा संबंधित नहीं है क्योंकि उन्होंने html टैग हटाने के उद्देश्य का उल्लेख नहीं किया था। लेकिन अगर उद्देश्य हमलों को रोकना है, जैसा कि कई मामलों में है, तो पहले से ही विकसित सैनिटाइज़र का उपयोग करना बेहतर दृष्टिकोण हो सकता है। BTW मुझे इस बारे में कोई जानकारी नहीं है कि html को सामान्य करने का अर्थ क्या है।
एहसान88

0

HTML अपने मूल रूप में सिर्फ XML में है। आप XmlDocument ऑब्जेक्ट में अपने पाठ को पार्स कर सकते हैं, और मूल तत्व पर इनर टेक्स्ट को टेक्स्ट निकालने के लिए कॉल कर सकते हैं। यह किसी भी रूप में सभी HTML tages को छीन लेगा और & lt; & Nbsp; सभी एक बार में


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