我正在研究的.NET Web系统允许最终用户在某些情况下输入HTML格式的文本。在其中一些地方,我们希望保留所有标签,但剥去任何尾随的断点标签(但在文本正文中留下任何断点。)

最好的方法是什么? (我可以想办法做到这一点,但我确信它们不是最好的。)

有帮助吗?

解决方案

正如@ 米奇所说,

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

其他提示

bdukes 代码,它应该更快,因为它不会回溯。

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

我确信这不是最好的方法,但它应该有效,除非你有尾随空格或其他东西。

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

我试图忽略原始问题中的歧义,并按字面意思阅读。这是一个扩展方法,它使TrimEnd重载以获取字符串。

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

以下是一些测试表明它有效:

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

我想指出这个解决方案比正则表达式更容易阅读,可能比正则表达式更快(你应该使用分析器,而不是推测,如果你关心性能),并且有助于从结束中删除其他东西字符串。

如果你的问题比你说的更通用,那么正则表达式会更合适(例如,如果你想删除&lt; BR&gt; &lt; / BR&gt; 并处理尾随空格或其他任何内容。

您可以使用正则表达式查找并删除正则表达式匹配的文本,以便在字符串的末尾锚定。

你也可以尝试(如果标记可能是一个有效的树)类似于:

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

上面的代码有点“暂存”。但如果您将其剪切并粘贴到控制台应用程序中并运行它,它确实有效:=)

您可以使用RegEx或检查尾随字符串是否为中断并将其删除

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top