Frage

Das .NET-Web-System arbeite ich an ermöglicht den Endbenutzer zur Eingabe von HTML-formatierten Text in einigen Situationen. In einigen dieser Orte, wollen wir alle Tags verlassen, aber keine Hinterumbrüche abzustreifen (aber keine Brüche im Inneren des Körpers des Textes zu verlassen.)

Was ist der beste Weg, dies zu tun? (Ich kann von Möglichkeiten denken, dies zu tun, aber ich bin sicher, dass sie nicht die beste.)

War es hilfreich?

Lösung

Wie @ Mitch sagte,

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

Andere Tipps

Kleine Änderung auf bdukes Code, die schneller sein sollte, da es nicht Rückzieher macht.

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

Ich bin sicher, dass dies auch nicht der beste Weg ist, aber es sollte funktionieren, wenn Sie Leerzeichen oder etwas haben Hinter.

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

Ich versuche, die Mehrdeutigkeit in Ihrer ursprünglichen Frage zu ignorieren, und es buchstäblich zu lesen. Hier ist eine Erweiterung Methode, die TrimEnd Überlastungen eine Zeichenfolge zu nehmen.

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

Hier sind einige Tests zu zeigen, dass es funktioniert:

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

Ich möchte darauf hinweisen, dass diese Lösung einfacher als regex zu lesen, wahrscheinlich schneller als regex (Sie einen Profiler, nicht die Spekulation verwenden sollten, wenn Sie über die Leistung besorgt sind), und nützlich für andere Dinge von den Enden entfernt von Strings.

regex wird besser geeignet, wenn Ihr Problem ist allgemeiner, als Sie (zum Beispiel angegeben, wenn Sie <BR> und </BR> und befassen sich mit Leerzeichen entfernen möchten oder was auch immer.

Sie können einen regulären Ausdruck verwenden, um den Text mit dem Regex am Ende des Strings zu verankern gesetzt zu finden und zu entfernen.

Sie könnten auch versuchen (wenn das Markup wahrscheinlich ist ein gültiger Baum sein) etwas Ähnliches wie:

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

Der obige Code ist ein bisschen „Scratch-Pad“, aber wenn Sie es in eine Konsolenanwendung Ausschneiden und Einfügen und führen Sie es, es funktioniert: =)

Sie können RegEx verwenden oder prüfen, ob der hintere String ist eine Pause und nehmen Sie es

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top