मैं ASP.NET में स्ट्रिंग से HTML टैग्स कैसे छीन सकता हूं?


123

ASP.NET का उपयोग करते हुए, मैं किसी दिए गए स्ट्रिंग से HTML टैग्स को मज़बूती से कैसे पट्टी कर सकता हूं (यानी रेगेक्स का उपयोग नहीं कर रहा हूं)? मैं PHP की तरह कुछ के लिए देख रहा हूँ strip_tags

उदाहरण:

<ul><li>Hello</li></ul>

आउटपुट:

"हैलो"

मैं पहिया को सुदृढ़ करने की कोशिश नहीं कर रहा हूं, लेकिन मुझे ऐसा कुछ भी नहीं मिला है जो अब तक मेरी जरूरतों को पूरा करता हो।


मुझे लगता है कि PHP पट्टी_टैग पर्दे के पीछे रेगेक्स का उपयोग करता है!
स्टेवशिपवेल

10
@ डैनियल: क्योंकि रेगेक्स उस पर बहुत बुरा है, खासकर यदि आपके पास घोंसला है।
जोएल कोएहॉर्न

हम्म, PHP की Strip_Tags की तरह नहीं दिखता है या तो विशेष रूप से विश्वसनीय है नोटों और टिप्पणियों पर जा रहा है: uk.php.net/strip_tags
Zhaph - बेन ड्यूगिड

जवाबों:


112

यदि यह स्ट्रिंग से सभी HTML टैग्स को हटा रहा है, तो यह रीगेक्स के साथ मज़बूती से काम करता है । बदलने के:

<[^>]*(>|$)

खाली स्ट्रिंग के साथ, विश्व स्तर पर। इसके बाद स्ट्रिंग को सामान्य करने के लिए मत भूलना, जगह:

[\s\r\n]+

एक एकल स्थान के साथ, और परिणाम को ट्रिम कर रहा है। वैकल्पिक रूप से किसी भी HTML वर्ण संस्थाओं को वास्तविक वर्णों में बदलें।

नोट :

  1. एक सीमा है: HTML और XML >विशेषता मानों में अनुमति देते हैं। इस तरह के मूल्यों का सामना करने पर यह समाधान टूटे हुए मार्कअप को लौटाएगा।
  2. समाधान तकनीकी रूप से सुरक्षित है, जैसे: परिणाम में ऐसी कोई भी चीज नहीं होगी जिसका उपयोग क्रॉस साइट स्क्रिप्टिंग या पेज लेआउट को तोड़ने के लिए किया जा सकता है। यह बहुत साफ नहीं है।
  3. सभी चीजों के साथ के रूप में HTML और regex: एक उचित पार्सर का
    उपयोग करें यदि आप इसे सभी परिस्थितियों में सही होना चाहिए।

52
यद्यपि अनुरोध नहीं किया गया है, मुझे लगता है कि बहुत से पाठक एचटीएम-एन्कोडिंग को भी छीनना चाहेंगे, जैसे &quote;। मैं इसके साथ संयोजन करता हूं WebUtility.HtmlDecode(जो बदले में टैग नहीं हटाएगा)। टैग हटाने के बाद इसका उपयोग करें, क्योंकि यह फिर से लिखना &gt;और हो सकता है &lt;। जैसेWebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
याहू गंभीर

@YahooS रहस्यमय एक उदाहरण प्रदान करने के लिए धन्यवाद। यह बहुत अच्छा काम करता है। धन्यवाद।
SearchForKnowledge

Html Agility Pack जाने का मार्ग है, मैंने इसका उपयोग वेबफ़ॉर्म में वापस करने के लिए संपूर्ण वेब पृष्ठों को सामग्री का उपयोग करने के लिए किया है!
Bojangles

3
@YahooSearch यह हालांकि & gt; लिपि और लेफ्टिनेंट; चेतावनी ( "XXS"); & gt; / लिपि और लेफ्टिनेंट; रेगेक्स द्वारा सैनिटाइज़ नहीं किया जाएगा लेकिन HtmlDecode द्वारा <स्क्रिप्ट> अलर्ट ("XXS") में परिवर्तित किया जाएगा; </ script>

1
@ हीथर बहुत अच्छी बात है। इकाई डीकोडिंग के बाद HTML टैग स्ट्रिपिंग फिर से करना होगा।
तोमलक

76

अब HTMLAgilityPack डाउनलोड करें! ;) डाउनलोड LInk

यह आपको HTML लोड और पार्स करने की अनुमति देता है। फिर आप DOM को नेविगेट कर सकते हैं और सभी विशेषताओं के आंतरिक मूल्यों को निकाल सकते हैं। गंभीरता से, यह आपको कोड की अधिकतम 10 पंक्तियां लेगा। यह वहाँ से बाहर सबसे बड़ी मुक्त .net पुस्तकालयों में से एक है।

यहाँ एक नमूना है:

            string htmlContents = new System.IO.StreamReader(resultsStream,Encoding.UTF8,true).ReadToEnd();

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(htmlContents);
            if (doc == null) return null;

            string output = "";
            foreach (var node in doc.DocumentNode.ChildNodes)
            {
                output += node.InnerText;
            }

2
आप प्रत्येक text()नोड को क्वेरी भी कर सकते हैं , सामग्री को ट्रिम कर सकते हैं और स्ट्रिंग कर सकते हैं। IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
jessehouwing

या बस, doc.DocumentNode.InnerText का उपयोग हालांकि इस whitespacehandling ऐसा लगता है ... के साथ कुछ मुद्दों है
jessehouwing

17
if (doc == null)जांच क्यों ? यह हमेशा झूठ है, ऐसा नहीं है?
एविसी

67
Regex.Replace(htmlText, "<.*?>", string.Empty);

सरल और अच्छा। धन्यवाद!
टिलिटो

5
कई मुद्दे हैं - उन </> विशेषताओं के साथ सौदा नहीं करता है और उन टैग के साथ अच्छी तरह से नहीं करता है जो एक पंक्ति से अधिक अवधि तक नहीं चलते हैं RegexOptions.SingleLine
क्रिस

2
नूओ, "<[^>] *>" का उपयोग करें।
पॉल किंइट्ज 20

11
protected string StripHtml(string Txt)
{
    return Regex.Replace(Txt, "<(.|\\n)*?>", string.Empty);
}    

Protected Function StripHtml(Txt as String) as String
    Return Regex.Replace(Txt, "<(.|\n)*?>", String.Empty)
End Function

2
गैर-यूनिक्स लाइनब्रेक सहित कई मामलों के लिए काम नहीं करता है।
क्रिस

6

मैंने इसे asp.net फ़ोरम पर पोस्ट किया है, और यह अभी भी वहाँ सबसे आसान समाधानों में से एक है। मैं गारंटी नहीं दूंगा कि यह सबसे तेज़ या सबसे कुशल है, लेकिन यह बहुत विश्वसनीय है। .NET में आप स्वयं HTML वेब कंट्रोल ऑब्जेक्ट का उपयोग कर सकते हैं। आपको वास्तव में अपना स्ट्रिंग एक अस्थायी HTML ऑब्जेक्ट जैसे कि DIV में सम्मिलित करना होगा, फिर सभी पाठों को हथियाने के लिए अंतर्निहित 'इनरटेक्स्ट' का उपयोग करें जो कि टैग में शामिल नहीं है। एक साधारण C # उदाहरण के लिए नीचे देखें:


System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
htmlDiv.InnerHtml = htmlString;
String plainText = htmlDiv.InnerText;

यह काम नहीं करता है, मैंने इसे सरल इनरहेटलएम = "<b> फू </ b>" के साथ परीक्षण किया; और इनरटेक्स्ट का मूल्य "<b> फू </ b>" है:
एक्सारीडैक्स

यह मत करो। यह समाधान आउटपुट में सीधे अन-इनकोडेड html को इंजेक्ट करता है। यह आपको क्रॉस साइट स्क्रिप्टिंग हमलों के लिए व्यापक रूप से खुला छोड़ देगा - आपने किसी को भी अनुमति दी है जो आपके आवेदन में किसी भी मनमाने ढंग से HTML और जावास्क्रिप्ट को इंजेक्ट करने के लिए html स्ट्रिंग को बदल सकता है!
नाविक

5

मैंने c # में एक बहुत तेज़ विधि लिखी है जो रेगेक्स से नरक को निकालता है। यह एक लेख में होस्ट किया गया है CodeProject पर गया है।

इसके फायदे नामित और गिने HTML निकाय को बदलने के लिए (जैसे उन की क्षमता बेहतर प्रदर्शन के अलावा, कर रहे हैं &amp;amp;और&203; ) और टिप्पणी ब्लॉक प्रतिस्थापन और अधिक।

कृपया संबंधित लेख को कोडप्रोजेक्ट पर पढ़ें ।

धन्यवाद।


4

आपमें से जो HtmlAgilityPack का उपयोग नहीं कर सकते हैं, उनके लिए .NETs XML रीडर एक विकल्प है। यह अच्छी तरह से स्वरूपित HTML पर विफल हो सकता है, इसलिए हमेशा बैकअप के रूप में रेक्स के साथ एक पकड़ जोड़ें। ध्यान दें कि यह तेज़ नहीं है, लेकिन यह डिबगिंग के माध्यम से पुराने स्कूल के कदम के लिए एक अच्छा अवसर प्रदान करता है।

public static string RemoveHTMLTags(string content)
    {
        var cleaned = string.Empty;
        try
        {
            StringBuilder textOnly = new StringBuilder();
            using (var reader = XmlNodeReader.Create(new System.IO.StringReader("<xml>" + content + "</xml>")))
            {
                while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Text)
                        textOnly.Append(reader.ReadContentAsString());
                }
            }
            cleaned = textOnly.ToString();
        }
        catch
        {
            //A tag is probably not closed. fallback to regex string clean.
            string textOnly = string.Empty;
            Regex tagRemove = new Regex(@"<[^>]*(>|$)");
            Regex compressSpaces = new Regex(@"[\s\r\n]+");
            textOnly = tagRemove.Replace(content, string.Empty);
            textOnly = compressSpaces.Replace(textOnly, " ");
            cleaned = textOnly;
        }

        return cleaned;
    }


1

जो लोग माइकल टिपटॉप के समाधान के बारे में शिकायत कर रहे हैं वे काम नहीं कर रहे हैं, यहां .Net4 + इसे करने का तरीका है:

public static string StripTags(this string markup)
{
    try
    {
        StringReader sr = new StringReader(markup);
        XPathDocument doc;
        using (XmlReader xr = XmlReader.Create(sr,
                           new XmlReaderSettings()
                           {
                               ConformanceLevel = ConformanceLevel.Fragment
                               // for multiple roots
                           }))
        {
            doc = new XPathDocument(xr);
        }

        return doc.CreateNavigator().Value; // .Value is similar to .InnerText of  
                                           //  XmlDocument or JavaScript's innerText
    }
    catch
    {
        return string.Empty;
    }
}

1
using System.Text.RegularExpressions;

string str = Regex.Replace(HttpUtility.HtmlDecode(HTMLString), "<.*?>", string.Empty);

0

मैंने यहां सुझाए गए रेगेक्स आधारित समाधानों पर ध्यान दिया है, और वे मुझे सबसे अधिक तुच्छ मामलों को छोड़कर किसी भी आत्मविश्वास से नहीं भरते हैं। एक विशेषता में कोण कोष्ठक यह सब तोड़ने के लिए ले जाएगा, अकेले जंगली से HTML के रूप में दुर्भावनापूर्ण HTML दें। और संस्थाओं के बारे में क्या पसंद है&amp; ? यदि आप HTML को सादे पाठ में बदलना चाहते हैं, तो आपको संस्थाओं को भी डीकोड करना होगा।

तो मैं नीचे विधि का प्रस्ताव करता हूं।

HtmlAgilityPack का उपयोग करते हुए , यह विस्तार विधि कुशलतापूर्वक एक HTML टुकड़े से सभी HTML टैग्स को स्ट्रिप्स करती है। HTML संस्थाओं को भी डीकोड करता है &amp;। प्रत्येक पाठ आइटम के बीच एक नई लाइन के साथ सिर्फ आंतरिक पाठ आइटम देता है।

public static string RemoveHtmlTags(this string html)
{
        if (String.IsNullOrEmpty(html))
            return html;

        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);

        if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
        {
            return WebUtility.HtmlDecode(html);
        }

        var sb = new StringBuilder();

        var i = 0;

        foreach (var node in doc.DocumentNode.ChildNodes)
        {
            var text = node.InnerText.SafeTrim();

            if (!String.IsNullOrEmpty(text))
            {
                sb.Append(text);

                if (i < doc.DocumentNode.ChildNodes.Count - 1)
                {
                    sb.Append(Environment.NewLine);
                }
            }

            i++;
        }

        var result = sb.ToString();

        return WebUtility.HtmlDecode(result);
}

public static string SafeTrim(this string str)
{
    if (str == null)
        return null;

    return str.Trim();
}

क्या तुम सच में गंभीर हैं, तो आप भी कुछ HTML टैग की सामग्री को अनदेखा करने के लिए (चाहते हैं <script>, <style>, <svg>, <head>,<object> मन के लिए आते हैं!) क्योंकि वे शायद समझ में हम के बाद कर रहे हैं में पठनीय सामग्री शामिल नहीं है। आप वहां क्या करते हैं, यह आपकी परिस्थितियों पर निर्भर करेगा और आप कितनी दूर जाना चाहते हैं, लेकिन HtmlAgilityPack का उपयोग करके यह श्वेतसूची या चयनित टैग को ब्लैकलिस्ट करने के लिए बहुत तुच्छ होगा।

यदि आप किसी HTML पृष्ठ पर सामग्री वापस दे रहे हैं, तो सुनिश्चित करें कि आप XSS भेद्यता को समझते हैं और इसे कैसे रोकें - यानी हमेशा किसी भी उपयोगकर्ता-दर्ज किए गए पाठ को एन्कोड करें जो HTML पृष्ठ पर वापस >हो जाता है ( &gt;आदि)।


0

दूसरे पैरामीटर के लिए, अर्थात कुछ टैग रखें, आपको HTMLagilityPack का उपयोग करके कुछ कोड की आवश्यकता हो सकती है:

public string StripTags(HtmlNode documentNode, IList keepTags)
{
    var result = new StringBuilder();
        foreach (var childNode in documentNode.ChildNodes)
        {
            if (childNode.Name.ToLower() == "#text")
            {
                result.Append(childNode.InnerText);
            }
            else
            {
                if (!keepTags.Contains(childNode.Name.ToLower()))
                {
                    result.Append(StripTags(childNode, keepTags));
                }
                else
                {
                    result.Append(childNode.OuterHtml.Replace(childNode.InnerHtml, StripTags(childNode, keepTags)));
                }
            }
        }
        return result.ToString();
    }

इस पृष्ठ पर अधिक व्याख्या: http : //nal एल्गोरिm.com.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/


0

आप इसे AngleSharp के साथ भी कर सकते हैं जो कि HtmlAgilityPack का विकल्प है (यह नहीं कि HAP खराब है)। HTML स्रोत से पाठ प्राप्त करने के लिए HAP की तुलना में उपयोग करना अधिक आसान है।

var parser = new HtmlParser();
var htmlDocument = parser.ParseDocument(source);
var text = htmlDocument.Body.Text();

आप मुख्य विशेषताओं अनुभाग पर एक नज़र डाल सकते हैं जहां वे एचएपी की तुलना में "बेहतर" होने पर एक मामला बनाते हैं। मुझे लगता है कि अधिकांश भाग के लिए, यह शायद वर्तमान प्रश्न के लिए ओवरकिल है, लेकिन फिर भी, यह एक दिलचस्प विकल्प है।


-4

बस उपयोग करें string.StripHTML();


3
जैसा @Serpiton बताते हैं, BCL में ऐसा कोई तरीका नहीं है। क्या आप इस पद्धति के कार्यान्वयन की ओर इशारा कर सकते हैं या अपना स्वयं का प्रावधान कर सकते हैं?
स्वेन ग्रोसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.