我正在开发的 .NET Web 系统允许最终用户在某些情况下输入 HTML 格式的文本。在其中一些地方,我们希望保留所有标签,但去掉任何尾随的中断标签(但在文本正文中留下任何中断。)
最好的方法是什么?(我可以想办法做到这一点,但我敢肯定它们不是最好的。)
正如@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);
对bdukes代码的小改动,应该更快,因为它不会回溯。
public static Regex regex = new Regex(
@"(?:\<br[^>]*\>)*$",
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");
我想指出,这个解决方案比正则表达式更容易阅读,可能比正则表达式更快(如果你关心性能,你应该使用分析器,而不是推测),并且对于从字符串末尾删除其他内容很有用。
如果您的问题比您说的更普遍(例如,如果您想删除并处理尾随空格或其他什么),则正则表达式变得更<BR>
合适</BR>
。
您可以使用正则表达式来查找和删除将正则表达式匹配设置为锚点在字符串末尾的文本。
您也可以尝试(如果标记可能是有效的树)类似于:
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 或检查尾随字符串是否为中断并将其删除