Как лучше всего удалить теги <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");

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

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

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

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

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