我正在研究的.NET Web系统允许最终用户在某些情况下输入HTML格式的文本。在其中一些地方,我们希望保留所有标签,但剥去任何尾随的断点标签(但在文本正文中留下任何断点。)
最好的方法是什么? (我可以想办法做到这一点,但我确信它们不是最好的。)
答案 0 :(得分:12)
正如@ 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*/?\>)*$",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
答案 1 :(得分:4)
对bdukes代码的小改动,因为它不会回溯,所以应该更快。
public static Regex regex = new Regex(
@"(?:\<br[^>]*\>)*$",
RegexOptions.IgnoreCase
| RegexOptions.CultureInvariant
| RegexOptions.IgnorePatternWhitespace
| RegexOptions.Compiled
);
regex.Replace(text, string.Empty);
答案 2 :(得分:3)
我确信这不是最好的方法,但它应该有效,除非你有尾随空格或其他东西。
while (myHtmlString.EndsWith("<br>"))
{
myHtmlString = myHtmlString.SubString(0, myHtmlString.Length - 4);
}
答案 3 :(得分:3)
我试图忽略原始问题中的歧义,并按字面意思阅读。这是一个扩展方法,它使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");
我想指出这个解决方案比正则表达式更容易阅读,可能比正则表达式更快(你应该使用分析器,而不是推测,如果你关心性能),并且有助于从结束中删除其他东西字符串。
如果您的问题比您所说的更为通用,那么正则表达式会更合适(例如,如果您要删除<BR>
和</BR>
并处理尾随空格或其他任何内容。
答案 4 :(得分:2)
您可以使用正则表达式查找并删除正则表达式匹配的文本,以便在字符串的末尾锚定。
答案 5 :(得分:1)
你也可以尝试(如果标记可能是一个有效的树)类似于:
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();
上面的代码有点“刮刮”但如果你将其剪切并粘贴到控制台应用程序中并运行它,它确实有效:=)
答案 6 :(得分:0)
您可以使用RegEx或检查尾随字符串是否为中断并将其删除