2008-09-25 14 views
6

El sistema web .NET en el que estoy trabajando permite al usuario final ingresar texto con formato HTML en algunas situaciones. En algunos de esos lugares, queremos dejar todas las etiquetas, pero quitar cualquier etiqueta de ruptura final (pero dejar cualquier interrupción dentro del cuerpo del texto).¿Cuál es la mejor manera de eliminar las etiquetas <br> del final de una cadena?

¿Cuál es la mejor manera de hacerlo? (Puedo pensar en formas de hacerlo, pero estoy seguro de que no son las mejores).

+0

¿Qué hay de
? ¿Qué hay detrás de espacio? Sírvanse proporcionar más detalles, en vez de hacernos especular. –

Respuesta

12

Como @Mitch dijo,

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

Puede usar una expresión regular para buscar y eliminar el texto con la coincidencia de expresiones regulares establecida para anclar al final de la cuerda.

3

Estoy seguro de que esta tampoco es la mejor manera, pero debería funcionar a menos que tenga espacios al final o algo así.

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

Tenga en cuenta que no es XHTML
. Su una etiqueta mal formado. – Will

+0

Verdadero. Por lo tanto, probablemente debería verificar las posibilidades


Pero aún así, esta no es la solución más elegante. –

0

puede utilizar expresiones regulares o compruebe si la cadena de arrastre es un descanso y quitarlo

+0

Esto solo acepta caracteres para recortar. –

+0

sí ... lo probé y edité mi respuesta. –

1

También puede probar (si es probable que el margen de beneficio ser un árbol válido) algo similar 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(); 

El código anterior es un "scratch-pad" poco, pero si cortar y pegar en una aplicación de consola y ejecutarlo, funciona: =)

3

Estoy tratando de ignorar la ambigüedad en su pregunta original, y leerlo literalmente. Aquí hay un método de extensión que sobrecarga TrimEnd para tomar una cadena.

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; 
    } 
} 

Estas son algunas pruebas para demostrar que funciona:

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

quiero señalar que esta solución es más fácil de leer que la expresión regular, probablemente más rápido que la expresión regular (se debe utilizar un generador de perfiles, no especulación, si le preocupa el rendimiento), y útil para eliminar otras cosas de los extremos de las cadenas.

expresiones regulares se vuelve más apropiado si su problema es más general que usted declaró (por ejemplo, si desea eliminar <BR> y </BR> y tratar con espacios a la derecha o lo que sea.

4

Pequeño cambio a bdukes código, que debe ser más rápido ya que no dar marcha atrás.

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