Pregunta

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 eliminar cualquier etiqueta de ruptura final (pero dejar cualquier ruptura dentro del cuerpo del texto).

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

¿Fue útil?

Solución

Como dijo @ 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);

Otros consejos

Pequeño cambio a bdukes , que debería ser más rápido ya que no da marcha atrás.

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

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

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

Intento ignorar la ambigüedad de tu pregunta original y leerla 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;
    }
}

Aquí hay 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 las expresiones regulares, probablemente más rápida que las expresiones regulares (debe usar un generador de perfiles, no especulación, si le preocupa el rendimiento), y es útil para eliminar otras cosas de los extremos. de cuerdas.

regex se vuelve más apropiado si su problema es más general de lo que dijo (por ejemplo, si desea eliminar < BR > y < / BR > y tratar) con espacios finales o lo que sea.

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 cadena.

También puedes probar (si es probable que el marcado sea 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 poco " scratch-pad " pero si lo corta y pega en una aplicación de la Consola y lo ejecuta, funciona: =)

puede usar RegEx o verificar si la cadena final es un salto y eliminarlo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top