ما هي أفضل طريقة لإزالة علامات <br> من نهاية السلسلة؟

StackOverflow https://stackoverflow.com/questions/135151

  •  02-07-2019
  •  | 
  •  

سؤال

يسمح نظام الويب .NET الذي أعمل عليه للمستخدم النهائي بإدخال نص بتنسيق HTML في بعض المواقف.في بعض هذه الأماكن، نريد ترك جميع العلامات، ولكن نزيل أي علامات فواصل لاحقة (ولكن نترك أي فواصل داخل نص النص).

ما هي الطريقة الأفضل لعمل هذا؟(أستطيع أن أفكر في طرق للقيام بذلك، ولكنني متأكد من أنها ليست الأفضل.)

هل كانت مفيدة؟

المحلول

مثل @ميتش قال،

//  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);

نصائح أخرى

تغيير صغير ل بدوقات الكود، والذي يجب أن يكون أسرع لأنه لا يتراجع.

public static Regex regex = new Regex(
    @"(?:\<br[^>]*\>)*$",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
);
regex.Replace(text, string.Empty);

أنا متأكد من أن هذه ليست الطريقة الأفضل أيضًا، ولكنها يجب أن تعمل إلا إذا كان لديك مسافات زائدة أو شيء من هذا القبيل.

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

أحاول تجاهل الغموض في سؤالك الأصلي وقراءته حرفيًا.فيما يلي طريقة تمديد تعمل على تحميل 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 (يجب عليك استخدام ملف التعريف، وليس المضاربة، إذا كنت مهتمًا بالأداء)، ومفيدًا لإزالة أشياء أخرى من نهايات السلاسل.

يصبح التعبير العادي أكثر ملاءمة إذا كانت مشكلتك أكثر عمومية مما ذكرت (على سبيل المثال، إذا كنت تريد إزالة <BR> و </BR> والتعامل مع المسافات الزائدة أو أيا كان.

يمكنك استخدام regex للعثور على النص وإزالته مع تعيين تطابق regex على المرساة في نهاية السلسلة.

يمكنك أيضًا تجربة (إذا كان من المحتمل أن تكون العلامة شجرة صالحة) شيئًا مشابهًا لما يلي:

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();

الكود أعلاه عبارة عن "لوحة مسودة" قليلاً، ولكن إذا قمت بقصه ولصقه في تطبيق وحدة التحكم وتشغيله، فإنه يعمل:=)

يمكنك استخدام RegEx أو التحقق مما إذا كانت السلسلة الزائدة عبارة عن فاصل وإزالتها

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top