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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top