HTML टैग हटाने के लिए C # रेगुलर एक्सप्रेशन का उपयोग करना


139

कोण ब्रैकेट सहित सभी HTML टैग को बदलने / हटाने के लिए मैं C # नियमित अभिव्यक्ति का उपयोग कैसे करूं? कृपया कोई मुझे कोड के साथ मदद कर सकता है?



आप इसे इंगित नहीं करते हैं, लेकिन मैं बता रहा हूं कि आप स्क्रिप्ट और शैली के तत्वों को पूरी तरह से हटाना चाहते हैं, न कि केवल टैग को हटा दें। नीचे दिए गए HTML चपलता पैक का उत्तर टैग हटाने के लिए सही है, लेकिन स्क्रिप्ट और शैली को हटाने के लिए, आपको कुछ कुछ भी चाहिए होगा जैसे stackoverflow.com/questions/13441470/…
John

1
डुप्लिकेट के रूप में इंगित किए गए प्रश्न में बहुत सारी जानकारी है (और टोनी द पोनी!), लेकिन यह केवल टैग खोलने के लिए कहा गया है, सभी टैग नहीं। इसलिए मुझे यकीन नहीं है कि यह तकनीकी रूप से एक डुप्लिकेट है। उस ने कहा, जवाब एक ही है: नहीं।
गोयडे

जवाबों:


154

जैसा कि पहले कहा गया है, आपको एक्सएमएल या एचटीएमएल दस्तावेजों को संसाधित करने के लिए नियमित अभिव्यक्तियों का उपयोग नहीं करना चाहिए। वे HTML और XML दस्तावेजों के साथ बहुत अच्छा प्रदर्शन नहीं करते हैं, क्योंकि सामान्य तरीके से नेस्टेड संरचनाओं को व्यक्त करने का कोई तरीका नहीं है।

आप निम्नलिखित का उपयोग कर सकते हैं।

String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);

यह ज्यादातर मामलों के लिए काम करेगा, लेकिन ऐसे मामले होंगे (उदाहरण के लिए CDATA कोण कोष्ठक युक्त) जहां यह अपेक्षा के अनुरूप काम नहीं करेगा।


13
यह एक भोली-भाली क्रियान्वयन है .. अर्थात <div id = "x <4>"> दुर्भाग्य से, मान्य html है। हालांकि ज्यादातर समझदार मामलों को संभालता है ..
रयान एमरेल

8
जैसा कि कहा गया है, मुझे पता है कि यह अभिव्यक्ति कुछ मामलों में विफल हो जाएगी। मुझे यह भी पक्का नहीं है कि सामान्य मामले को बिना किसी नियमित अभिव्यक्ति के त्रुटियों के द्वारा नियंत्रित किया जा सकता है या नहीं।
डैनियल ब्रुकनर

1
यह सभी मामलों में विफल रहेगा! इसका लालची।
जेक

13
@ सिफर, आपको क्यों लगता है कि लालच एक समस्या है? मान लें कि मैच वैध HTML टैग की शुरुआत में शुरू होता है, तो यह उस टैग के अंत से आगे कभी नहीं बढ़ेगा। यही [^>] के लिए है।
एलन मूर

1
@AlanMoore html एक "नियमित भाषा" नहीं है, अर्थात आप उन सभी चीज़ों से ठीक से मेल नहीं खा सकते हैं जो रीजेक्स के साथ मान्य HTML हैं। देखें: stackoverflow.com/questions/590747/…
काच

78

सही उत्तर यह नहीं है कि, HTML चपलता पैक का उपयोग करें ।

जोड़ने के लिए संपादित:

बेशर्मी से जेसी द्वारा टिप्पणी से नीचे चोरी करने के लिए, और इस समय के बाद इस सवाल का अपर्याप्त उत्तर देने के आरोप से बचने के लिए, यहां HTML चपलता पैक का उपयोग करके एक सरल, विश्वसनीय स्निपेट है जो HTML के सबसे शानदार रूप से बिट्स के साथ काम करता है:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Properties.Resources.HtmlContents);
var text = doc.DocumentNode.SelectNodes("//body//text()").Select(node => node.InnerText);
StringBuilder output = new StringBuilder();
foreach (string line in text)
{
   output.AppendLine(line);
}
string textOnly = HttpUtility.HtmlDecode(output.ToString());

HTML को पार्स करने के लिए एक नियमित अभिव्यक्ति का उपयोग करने के लिए बहुत कम बचाव योग्य मामले हैं, क्योंकि HTML को संदर्भ-जागरूकता के बिना सही ढंग से पार्स नहीं किया जा सकता है जो कि एक nontraditional regex इंजन में भी प्रदान करने के लिए बहुत दर्दनाक है। आप एक RegEx के साथ वहां भाग ले सकते हैं, लेकिन आपको मैन्युअल सत्यापन करने की आवश्यकता होगी।

एचटीएमएल एगिलिटी पैक आपको एक मजबूत समाधान प्रदान कर सकता है जो कि उन संदर्भों को मैन्युअल रूप से ठीक करने की आवश्यकता को कम कर देगा जो परिणाम के रूप में HTML को संदर्भ-मुक्त व्याकरण के रूप में भलीभांति व्यवहार कर सकते हैं।

एक नियमित अभिव्यक्ति आपको ज्यादातर वही मिल सकती है जो आप ज्यादातर समय चाहते हैं, लेकिन यह बहुत सामान्य मामलों में विफल हो जाएगा। यदि आप HTML चपलता पैक से बेहतर / तेज पार्सर पा सकते हैं, तो इसके लिए जाएं, लेकिन कृपया दुनिया को अधिक टूटी हुई HTML हैकरी के अधीन न करें।


27
HTML चपलता पैक HTML के साथ काम करने से संबंधित हर चीज का जवाब नहीं है (जैसे कि क्या होगा यदि आप केवल HTML कोड के टुकड़े के साथ काम करना चाहते हैं!)।
प्रोपेलरहेड

7
यह HTML के टुकड़ों के साथ बहुत अच्छी तरह से काम करता है, और यह मूल पोस्टर द्वारा वर्णित परिदृश्य के लिए सबसे अच्छा विकल्प है। दूसरी ओर, रेगेक्स केवल एक आदर्श HTML के साथ काम करता है और पूरी तरह से मान्य HTML के साथ टूट जाएगा, क्योंकि HTML का व्याकरण नियमित नहीं है। यदि वह रूबी का उपयोग कर रहे थे, तो मैंने अभी भी नोगोगिरी या हरिकोट, या पाइथन के लिए सुंदरसोप का सुझाव दिया होगा। यह HTML की तरह HTML का इलाज करने के लिए सबसे अच्छा है, कोई व्याकरण के साथ कुछ मनमाना पाठ स्ट्रीम नहीं।
जेसनट्रू

1
HTML एक नियमित व्याकरण नहीं है, और इसलिए इसे नियमित रूप से अभिव्यक्त नहीं किया जा सकता है। आप लेक्सिंग के लिए रेगेक्स का उपयोग कर सकते हैं, लेकिन पार्सिंग के लिए नहीं। यह वास्तव में इतना आसान है। HTML के अस्तित्व में होने से पहले भाषाविदों ने इस पर सहमति व्यक्त की होगी।
जेसनट्र्यू

20
यह राय का विषय नहीं है। एक नियमित अभिव्यक्ति आपको ज्यादातर वही मिल सकती है जो आप ज्यादातर समय चाहते हैं, लेकिन यह बहुत सामान्य मामलों में विफल हो जाएगा। यदि आप HTML चपलता पैक की तुलना में बेहतर / तेज पार्सर पा सकते हैं, तो इसके लिए जाएं, लेकिन कृपया दुनिया को टूटे हुए HTML हैकरी के अधीन न करें।
जेसनट्र्यू

2
HTML को पार्स किए बिना आप HTML टैग्स की सही पहचान नहीं कर सकते। क्या आप HTML के लिए सभी व्याकरण को समझते हैं? "बहुत करीब" प्राप्त करने के लिए बुराई हैक देखें जो अन्य उत्तर सुझाते हैं, और मुझे बताएं कि आप इसे क्यों बनाए रखना चाहते हैं। मुझे नीचा दिखाना क्योंकि आपके सैंपल इनपुट के लिए हैकिंग क्विक प्रयास आपके समाधान को सही नहीं बनाने वाला है। मैंने कभी-कभी HTML सामग्री से रिपोर्ट तैयार करने या नकारात्मक मिलान का उपयोग करके & gt; त्रुटियों की संभावना को सीमित करने के लिए, लेकिन हमने अतिरिक्त सत्यापन किए; यह सामान्य उद्देश्य नहीं था।
जेसनट्र्यू

38

प्रश्न का उत्तर निश्चित रूप से दिया जाना बहुत व्यापक है। क्या आप वेब पेज की तरह, वास्तविक दुनिया के HTML दस्तावेज़ से सभी टैग हटाने की बात कर रहे हैं? यदि हां, तो आपको निम्न करना होगा:

  • </ DOCTYPE घोषणा या <? xml prolog को हटा दें यदि वे मौजूद हैं
  • सभी एसजीएमएल टिप्पणियों को हटा दें
  • पूरे सिर तत्व को हटा दें
  • सभी SCRIPT और स्टाइल तत्वों को हटा दें
  • फोर्थर-पता है कि क्या फार्म और टेबल तत्वों के साथ
  • शेष टैग हटा दें
  • CDATA अनुभागों से <! [CDATA [और]]> अनुक्रम हटाएं, लेकिन अपनी सामग्री को अकेले छोड़ दें

वह सिर्फ मेरे सिर के ऊपर से है - मुझे यकीन है कि वहाँ अधिक है। एक बार जब आप वह सब कर लेते हैं, तो आप शब्दों, वाक्यों और पैराग्राफों को कुछ स्थानों पर एक साथ चलाते हैं, और दूसरों में बेकार व्हाट्सएप का बड़ा हिस्सा।

लेकिन, यह मानते हुए कि आप केवल एक टुकड़े के साथ काम कर रहे हैं और आप सभी टैग को हटाकर दूर हो सकते हैं, यहाँ रेगेक्स का उपयोग करूंगा:

@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"

अपने स्वयं के विकल्पों में एकल- और डबल-उद्धृत स्ट्रिंग्स का मिलान विशेषता मानों में कोण कोष्ठक की समस्या से निपटने के लिए पर्याप्त है। मुझे रयान के जवाब में रेगेक्स की तरह विशेषता के नाम और टैग के अंदर के अन्य सामान को स्पष्ट रूप से मिलाने की कोई आवश्यकता नहीं है; पहला वैकल्पिक सब संभालता है।

यदि आप उन (?>...)निर्माणों के बारे में सोच रहे हैं , तो वे परमाणु समूह हैं । वे रेगेक्स को थोड़ा और अधिक कुशल बनाते हैं, लेकिन इससे भी महत्वपूर्ण बात यह है कि वे भागते हुए बैकट्रैकिंग को रोकते हैं, जो कि आपको हमेशा तब देखना चाहिए जब आप अल्टरनेशन और नेस्टेड क्वांटिफायर को मिलाते हैं जैसा कि मैंने किया है। मैं वास्तव में नहीं सोचता कि यहां कोई समस्या होगी, लेकिन मुझे पता है कि अगर मैं इसका उल्लेख नहीं करता, तो कोई और करेगा। ;-)

यह रेगेक्स बिल्कुल सही नहीं है, लेकिन यह शायद उतना ही अच्छा है जितना कि आपको कभी भी आवश्यकता होगी।


1
यह अब तक का सबसे अच्छा जवाब है। आप पोस्टर के प्रश्न का उत्तर देते हैं और समझाते हैं कि दिए गए कार्य के लिए एक नियमित अभिव्यक्ति का उपयोग क्यों नहीं किया जाना चाहिए। बहुत बढ़िया।
JWilliams


18

@JasonTrue सही है, कि HTML टैग को अलग-अलग रेग्युलर एक्सप्रेशन के जरिए नहीं किया जाना चाहिए।

HTML टैग्स को HtmlAgilityPack का उपयोग करना काफी सरल है:

public string StripTags(string input) {
    var doc = new HtmlDocument();
    doc.LoadHtml(input ?? "");
    return doc.DocumentNode.InnerText;
}

1
जब तक मुझे इस पर थोड़ी देर हो जाती है मैं यह उल्लेख करना चाहूंगा कि यह xml पर भी काम करता है जैसे कि वर्ड और अन्य कार्यालय उत्पादों द्वारा उत्पादित। जिस किसी को भी वर्ड xml से निपटने की आवश्यकता थी, वह इस का उपयोग करने के लिए अच्छी तरह से देखेगा क्योंकि यह बहुत मदद करता है, खासकर यदि आपको सामग्री से टैग छीनने की आवश्यकता है जो वास्तव में मुझे इसकी आवश्यकता है।
स्टीव पेटीफ़र

जब बाकी सभी विफल होने लगे, तो इस सरल कोड स्निपेट ने दिन बचा लिया। धन्यवाद!
टेड क्रैफ

14

मैं जेसन की प्रतिक्रिया को प्रतिध्वनित करना चाहता हूं, हालांकि कभी-कभी आपको कुछ एचटीएमएल को भोलेपन से पार्स करने और पाठ सामग्री को बाहर निकालने की आवश्यकता होती है।

मुझे कुछ एचटीएमएल के साथ ऐसा करने की आवश्यकता थी जो कि एक समृद्ध पाठ संपादक द्वारा बनाया गया था, हमेशा मजेदार और खेल।

इस मामले में आपको कुछ टैगों की सामग्री को हटाने की आवश्यकता हो सकती है और साथ ही सिर्फ खुद को टैग करने की भी आवश्यकता होगी।

मेरे मामले में और टैग इस मिश्रण में फेंक दिए गए थे। कुछ लोग मेरे (बहुत कम) कम भोले कार्यान्वयन को एक उपयोगी शुरुआती बिंदु पा सकते हैं।

   /// <summary>
    /// Removes all html tags from string and leaves only plain text
    /// Removes content of <xml></xml> and <style></style> tags as aim to get text content not markup /meta data.
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public static string HtmlStrip(this string input)
    {
        input = Regex.Replace(input, "<style>(.|\n)*?</style>",string.Empty);
        input = Regex.Replace(input, @"<xml>(.|\n)*?</xml>", string.Empty); // remove all <xml></xml> tags and anything inbetween.  
        return Regex.Replace(input, @"<(.|\n)*?>", string.Empty); // remove any tags but not there content "<p>bob<span> johnson</span></p>" becomes "bob johnson"
    }

1
स्पष्ट crossplatform लाइनब्रेक मुद्दों के अलावा, जब सामग्री का सीमांकित किया जाता है तो एक लालची क्वांटिफायर धीमा होता है। की तरह उपयोग चीजों <xml>.*(?!</xml>)</xml>के साथ RegexOptions.SingleLineके लिए पहले दो संशोधक और <[^>]*>पिछले के लिए। पहले लोगों को भी पहले टैग नाम में एक कैप्चर किए गए विकल्प द्वारा जोड़ा जा सकता है और इसे नकारात्मक लुकहेड और अंतिम टैग में बैकरेफरेंस दिया जा सकता है।
क्रिसएफ

5

इस URL पर नियमित अभिव्यक्ति विधि आज़माएँ: http://www.dotnetperls.com/remove-html-tags

/// <summary>
/// Remove HTML from string with Regex.
/// </summary>
public static string StripTagsRegex(string source)
{
return Regex.Replace(source, "<.*?>", string.Empty);
}

/// <summary>
/// Compiled regular expression for performance.
/// </summary>
static Regex _htmlRegex = new Regex("<.*?>", RegexOptions.Compiled);

/// <summary>
/// Remove HTML from string with compiled Regex.
/// </summary>
public static string StripTagsRegexCompiled(string source)
{
return _htmlRegex.Replace(source, string.Empty);
}



-1

टैग हटाने के लिए इस विधि का उपयोग करें:

public string From_To(string text, string from, string to)
{
    if (text == null)
        return null;
    string pattern = @"" + from + ".*?" + to;
    Regex rx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
    MatchCollection matches = rx.Matches(text);
    return matches.Count <= 0 ? text : matches.Cast<Match>().Where(match => !string.IsNullOrEmpty(match.Value)).Aggregate(text, (current, match) => current.Replace(match.Value, ""));
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.