Question

Le système Web .NET sur lequel je travaille permet à l'utilisateur final de saisir du texte au format HTML dans certaines situations. Dans certains de ces endroits, nous souhaitons laisser toutes les balises, mais enlever toutes les balises de fin de ligne (mais laisser les pauses à l'intérieur du corps du texte.)

Quelle est la meilleure façon de faire cela? (Je peux penser à des façons de le faire, mais je suis sûr qu'ils ne sont pas les meilleurs.)

Était-ce utile?

La solution

Comme @ Mitch , a déclaré:

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

Autres conseils

Petit changement sur bdukes , ce qui devrait être plus rapide car il ne revient pas en arrière.

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

Je suis sûr que ce n'est pas la meilleure solution non plus, mais cela devrait fonctionner à moins que vous n'ayez des espaces de fin ou quelque chose du genre.

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

J'essaie d'ignorer l'ambiguïté de votre question initiale et de la lire littéralement. Voici une méthode d'extension qui surcharge TrimEnd pour qu'elle prenne une chaîne.

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

Voici quelques tests pour montrer que cela fonctionne:

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

Je tiens à souligner que cette solution est plus facile à lire que regex, probablement plus rapide que regex (vous devez utiliser un profileur, et non des spéculations si vous êtes préoccupé par les performances), et utile pour supprimer d'autres éléments. de chaînes.

regex devient plus approprié si votre problème est plus général que ce que vous avez déclaré (par exemple, si vous souhaitez supprimer
et et et traiter avec des espaces de fuite ou autre chose.

Vous pouvez utiliser une expression rationnelle pour rechercher et supprimer le texte avec la correspondance d'expression régulière définie pour ancrer à la fin de la chaîne.

Vous pouvez également essayer (si le balisage est probablement un arbre valide) quelque chose de similaire à:

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();

Le code ci-dessus est un peu "bloc-notes". mais si vous le coupez et le collez dans une application console et que vous l'exécutez, cela fonctionne: =)

vous pouvez utiliser RegEx ou vérifier si la chaîne de fin est une rupture et la supprimer

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top