2008-09-25 10 views
6

जिस .NET वेब सिस्टम पर मैं काम कर रहा हूं, अंत उपयोगकर्ता को कुछ स्थितियों में HTML स्वरूपित पाठ इनपुट करने की अनुमति देता है। उन स्थानों में से, हम सभी टैग छोड़ना चाहते हैं, लेकिन किसी भी पीछे वाले ब्रेक टैग को बंद करना चाहते हैं (लेकिन पाठ के शरीर के अंदर किसी भी ब्रेक को छोड़ दें।)स्ट्रिंग के अंत से <br> टैग हटाने का सबसे अच्छा तरीका क्या है?

ऐसा करने का सबसे अच्छा तरीका क्या है? (मैं यह करने के तरीकों के बारे में सोच सकता हूं, लेकिन मुझे यकीन है कि वे सबसे अच्छे नहीं हैं।)

+0

क्या
के बारे में? क्या अंतरिक्ष अनुगामी? और विवरण प्रदान करें, बजाय हमें अटकलें बना रही है। के बारे में –

उत्तर

12

के रूप में @Mitch कहा जा सकता है,

// using System.Text.RegularExpressions; 

/// <summary> 
/// Regular expression built for C# on: Thu, Sep 25, 2008, 02:01:36 PM 
/// Using Expresso Version: 2.1.2150, http://www.ultrapico.com 
/// 
/// A description of the regular expression: 
/// 
/// Match expression but don't capture it. [\<br\s*/?\>], any number of repetitions 
///  \<br\s*/?\> 
///   < 
///   br 
///   Whitespace, any number of repetitions 
///   /, zero or one repetitions 
///   > 
/// End of line or string 
/// 
/// 
/// </summary> 
public static Regex regex = new Regex(
    @"(?:\<br\s*/?\>)*$", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 
regex.Replace(text, string.Empty); 
2

आप रेगेक्स मैच सेट के साथ पाठ को खोजने और हटाने के लिए रेगेक्स का उपयोग कर सकते हैं स्ट्रिंग।

3

मुझे यकीन है कि यह सबसे अच्छा तरीका नहीं है, लेकिन यह तब तक काम करना चाहिए जब तक कि आपके पास पिछली जगह या कुछ न हो।

while (myHtmlString.EndsWith("<br>")) 
{ 
    myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4); 
} 
+0

ध्यान रखें कि
एक्सएचटीएमएल नहीं है। यह एक बुरी तरह से गठन टैग। – Will

+0

सच है। तो शायद यह संभावनाओं की जांच करनी चाहिए


लेकिन फिर भी, यह सबसे सुंदर समाधान नहीं है। –

0

आप रेगुलर एक्सप्रेशन से उपयोग करें या जाँच करता है, तो पीछे स्ट्रिंग एक को तोड़ने और हटाने यह

+0

यह केवल वर्णों को ट्रिम करने के लिए स्वीकार करता है। –

+0

हाँ ... इसका परीक्षण किया और मेरा जवाब संपादित किया। –

1

तुम भी (यदि मार्कअप की संभावना है की कोशिश कर सकते एक वैध पेड़ बनें) कुछ ऐसा:

string s = "<markup><div>Text</div><br /><br /></markup>"; 

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(s); 

Console.WriteLine(doc.InnerXml); 

XmlElement markup = doc["markup"]; 
int childCount = markup.ChildNodes.Count; 
for (int i = childCount -1; i >= 0; i--) 
{ 
    if (markup.ChildNodes[i].Name.ToLower() == "br") 
    { 
     markup.RemoveChild(markup.ChildNodes[i]); 
    } 
    else 
    { 
     break; 
    } 
} 
Console.WriteLine("---"); 
Console.WriteLine(markup.InnerXml); 
Console.ReadKey(); 

उपरोक्त कोड थोड़ा "स्क्रैच-पैड" है लेकिन यदि आप इसे कंसोल एप्लिकेशन में काटकर पेस्ट करें और इसे चलाएं, यह काम करता है: =)

3

मैं आपके मूल प्रश्न में अस्पष्टता को अनदेखा करने की कोशिश कर रहा हूं, और इसे सचमुच पढ़ता हूं। यहां एक विस्तार विधि है जो एक स्ट्रिंग लेने के लिए TrimEnd ओवरलोड करता है।

static class StringExtensions 
{ 
    public static string TrimEnd(this string s, string remove) 
    { 
     if (s.EndsWith(remove)) 
     { 
      return s.Substring(0, s.Length - remove.Length); 
     } 
     return s; 
    } 
} 

यहाँ है कि यह काम करता है दिखाने के लिए कुछ परीक्षण कर रहे हैं:

 Debug.Assert("abc".TrimEnd("<br>") == "abc"); 
     Debug.Assert("abc<br>".TrimEnd("<br>") == "abc"); 
     Debug.Assert("<br>abc".TrimEnd("<br>") == "<br>abc"); 

मैं कहना है कि यह समाधान आसान है regex से पढ़ना चाहते हैं, शायद regex की तुलना में तेजी (यदि आप एक प्रोफाइलर का उपयोग करना चाहिए, अटकलें नहीं, अगर आप प्रदर्शन के बारे में चिंतित हैं), और तारों के सिरों से अन्य चीजों को हटाने के लिए उपयोगी है।

regex और अधिक उपयुक्त हो जाता है यदि आपकी समस्या से आप ने कहा (अधिक सामान्य है जैसे, आप <BR> और </BR> दूर करने के लिए और सौदा पीछे कोई रिक्ति या जो कुछ भी साथ।

4

छोटे परिवर्तन bdukes कोड है, जो तेजी से होना चाहिए चाहते हैं के रूप में यह पीछे नहीं है।

public static Regex regex = new Regex(
    @"(?:\<br[^>]*\>)*$", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
); 
regex.Replace(text, string.Empty); 
संबंधित मुद्दे

 संबंधित मुद्दे