कोण ब्रैकेट सहित सभी HTML टैग को बदलने / हटाने के लिए मैं C # नियमित अभिव्यक्ति का उपयोग कैसे करूं? कृपया कोई मुझे कोड के साथ मदद कर सकता है?
कोण ब्रैकेट सहित सभी HTML टैग को बदलने / हटाने के लिए मैं C # नियमित अभिव्यक्ति का उपयोग कैसे करूं? कृपया कोई मुझे कोड के साथ मदद कर सकता है?
जवाबों:
जैसा कि पहले कहा गया है, आपको एक्सएमएल या एचटीएमएल दस्तावेजों को संसाधित करने के लिए नियमित अभिव्यक्तियों का उपयोग नहीं करना चाहिए। वे HTML और XML दस्तावेजों के साथ बहुत अच्छा प्रदर्शन नहीं करते हैं, क्योंकि सामान्य तरीके से नेस्टेड संरचनाओं को व्यक्त करने का कोई तरीका नहीं है।
आप निम्नलिखित का उपयोग कर सकते हैं।
String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty);
यह ज्यादातर मामलों के लिए काम करेगा, लेकिन ऐसे मामले होंगे (उदाहरण के लिए CDATA कोण कोष्ठक युक्त) जहां यह अपेक्षा के अनुरूप काम नहीं करेगा।
सही उत्तर यह नहीं है कि, 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 हैकरी के अधीन न करें।
प्रश्न का उत्तर निश्चित रूप से दिया जाना बहुत व्यापक है। क्या आप वेब पेज की तरह, वास्तविक दुनिया के HTML दस्तावेज़ से सभी टैग हटाने की बात कर रहे हैं? यदि हां, तो आपको निम्न करना होगा:
वह सिर्फ मेरे सिर के ऊपर से है - मुझे यकीन है कि वहाँ अधिक है। एक बार जब आप वह सब कर लेते हैं, तो आप शब्दों, वाक्यों और पैराग्राफों को कुछ स्थानों पर एक साथ चलाते हैं, और दूसरों में बेकार व्हाट्सएप का बड़ा हिस्सा।
लेकिन, यह मानते हुए कि आप केवल एक टुकड़े के साथ काम कर रहे हैं और आप सभी टैग को हटाकर दूर हो सकते हैं, यहाँ रेगेक्स का उपयोग करूंगा:
@"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>"
अपने स्वयं के विकल्पों में एकल- और डबल-उद्धृत स्ट्रिंग्स का मिलान विशेषता मानों में कोण कोष्ठक की समस्या से निपटने के लिए पर्याप्त है। मुझे रयान के जवाब में रेगेक्स की तरह विशेषता के नाम और टैग के अंदर के अन्य सामान को स्पष्ट रूप से मिलाने की कोई आवश्यकता नहीं है; पहला वैकल्पिक सब संभालता है।
यदि आप उन (?>...)
निर्माणों के बारे में सोच रहे हैं , तो वे परमाणु समूह हैं । वे रेगेक्स को थोड़ा और अधिक कुशल बनाते हैं, लेकिन इससे भी महत्वपूर्ण बात यह है कि वे भागते हुए बैकट्रैकिंग को रोकते हैं, जो कि आपको हमेशा तब देखना चाहिए जब आप अल्टरनेशन और नेस्टेड क्वांटिफायर को मिलाते हैं जैसा कि मैंने किया है। मैं वास्तव में नहीं सोचता कि यहां कोई समस्या होगी, लेकिन मुझे पता है कि अगर मैं इसका उल्लेख नहीं करता, तो कोई और करेगा। ;-)
यह रेगेक्स बिल्कुल सही नहीं है, लेकिन यह शायद उतना ही अच्छा है जितना कि आपको कभी भी आवश्यकता होगी।
Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline);
@JasonTrue सही है, कि HTML टैग को अलग-अलग रेग्युलर एक्सप्रेशन के जरिए नहीं किया जाना चाहिए।
HTML टैग्स को HtmlAgilityPack का उपयोग करना काफी सरल है:
public string StripTags(string input) {
var doc = new HtmlDocument();
doc.LoadHtml(input ?? "");
return doc.DocumentNode.InnerText;
}
मैं जेसन की प्रतिक्रिया को प्रतिध्वनित करना चाहता हूं, हालांकि कभी-कभी आपको कुछ एचटीएमएल को भोलेपन से पार्स करने और पाठ सामग्री को बाहर निकालने की आवश्यकता होती है।
मुझे कुछ एचटीएमएल के साथ ऐसा करने की आवश्यकता थी जो कि एक समृद्ध पाठ संपादक द्वारा बनाया गया था, हमेशा मजेदार और खेल।
इस मामले में आपको कुछ टैगों की सामग्री को हटाने की आवश्यकता हो सकती है और साथ ही सिर्फ खुद को टैग करने की भी आवश्यकता होगी।
मेरे मामले में और टैग इस मिश्रण में फेंक दिए गए थे। कुछ लोग मेरे (बहुत कम) कम भोले कार्यान्वयन को एक उपयोगी शुरुआती बिंदु पा सकते हैं।
/// <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"
}
<xml>.*(?!</xml>)</xml>
के साथ RegexOptions.SingleLine
के लिए पहले दो संशोधक और <[^>]*>
पिछले के लिए। पहले लोगों को भी पहले टैग नाम में एक कैप्चर किए गए विकल्प द्वारा जोड़ा जा सकता है और इसे नकारात्मक लुकहेड और अंतिम टैग में बैकरेफरेंस दिया जा सकता है।
इस 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);
}
टैग हटाने के लिए इस विधि का उपयोग करें:
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, ""));
}