Qual è il modo migliore per rimuovere < br > tag dalla fine di una stringa?
Domanda
Il sistema Web .NET su cui sto lavorando consente all'utente finale di inserire testo in formato HTML in alcune situazioni. In alcuni di questi posti, vogliamo lasciare tutti i tag, ma rimuoviamo tutti i tag di interruzione finali (ma lasciamo eventuali interruzioni all'interno del corpo del testo.)
Qual è il modo migliore per farlo? (Posso pensare a modi per farlo, ma sono sicuro che non sono i migliori.)
Soluzione
Come ha detto @ 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*/?\>)*<*>quot;,
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
Altri suggerimenti
Piccola modifica a codice bdukes , che dovrebbe essere più veloce in quanto non esegue il backtrack.
public static Regex regex = new Regex(
@"(?:\<br[^>]*\>)*<*>quot;,
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
Sono sicuro che neanche questo è il modo migliore, ma dovrebbe funzionare a meno che tu non abbia spazi finali o qualcosa del genere.
while (myHtmlString.EndsWith("<br>"))
{
myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4);
}
Sto cercando di ignorare l'ambiguità nella tua domanda originale e di leggerla letteralmente. Ecco un metodo di estensione che sovraccarica TrimEnd per prendere una stringa.
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;
}
}
Ecco alcuni test per dimostrare che funziona:
Debug.Assert("abc".TrimEnd("<br>") == "abc");
Debug.Assert("abc<br>".TrimEnd("<br>") == "abc");
Debug.Assert("<br>abc".TrimEnd("<br>") == "<br>abc");
Voglio sottolineare che questa soluzione è più facile da leggere rispetto a regex, probabilmente più veloce di regex (dovresti usare un profiler, non una speculazione, se sei preoccupato per le prestazioni), e utile per rimuovere altre cose dalle estremità di stringhe.
regex diventa più appropriato se il tuo problema è più generale di quanto hai dichiarato (ad esempio, se desideri rimuovere < BR >
e < / BR >
e trattare con spazi finali o altro.
Puoi usare una regex per trovare e rimuovere il testo con la corrispondenza regex impostata su anchor alla fine della stringa.
Puoi anche provare (se è probabile che il markup sia un albero valido) qualcosa di simile a:
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();
Il codice sopra è un po '"scratch-pad" ma se lo tagli e lo incolli in un'applicazione Console e lo esegui, funziona: =)
puoi usare RegEx o verificare se la stringa finale è una rottura e rimuoverla