Каков наилучший способ удалить теги <br>с конца строки? - PullRequest
6 голосов
/ 25 сентября 2008

Веб-система .NET, над которой я работаю, позволяет конечному пользователю в некоторых случаях вводить текст в формате HTML. В некоторых из этих мест мы хотим оставить все теги, но убрать все теги конечных разрывов (но оставить все разрывы внутри текста).

Какой лучший способ сделать это? (Я могу придумать способы сделать это, но я уверен, что они не лучшие.)

Ответы [ 7 ]

12 голосов
/ 25 сентября 2008

Как сказал * Митч ,

//  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);
4 голосов
/ 25 сентября 2008

Небольшое изменение кода bdukes , которое должно быть быстрее, так как оно не возвращается.

public static Regex regex = new Regex(
    @"(?:\<br[^>]*\>)*$",
    RegexOptions.IgnoreCase
    | RegexOptions.CultureInvariant
    | RegexOptions.IgnorePatternWhitespace
    | RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
3 голосов
/ 25 сентября 2008

Я пытаюсь игнорировать двусмысленность в вашем первоначальном вопросе и читаю его буквально. Вот метод расширения, который перегружает 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");

Я хочу отметить, что это решение легче читать, чем регулярное выражение, возможно, быстрее, чем регулярное выражение (вы должны использовать профилировщик, а не спекуляции, если вы беспокоитесь о производительности), и полезно для удаления других вещей с концов строк.

Регулярное выражение становится более подходящим, если ваша проблема носит более общий характер, чем вы заявили (например, если вы хотите удалить <BR> и </BR> и иметь дело с конечными пробелами или чем-то еще.

3 голосов
/ 25 сентября 2008

Я уверен, что это тоже не лучший способ, но он должен работать, если у вас нет пробелов или что-то в этом роде.

while (myHtmlString.EndsWith("<br>"))
{
    myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4);
}
2 голосов
/ 25 сентября 2008

Вы можете использовать регулярное выражение для поиска и удаления текста с установленным соответствием регулярного выражения в конце строки.

1 голос
/ 25 сентября 2008

Вы также можете попробовать (если разметка, вероятно, является допустимым деревом) что-то похожее на:

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

Приведенный выше код немного "блокнот", но если вы вырезаете и вставляете его в консольное приложение и запускаете, он работает: =)

0 голосов
/ 25 сентября 2008

Вы можете использовать RegEx или проверить, является ли конечная строка разрывом, и удалить ее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...