为了厚颜无耻地剽窃 Jesse 下面的评论,并避免被指责一直以来没有充分回答这个问题,这里有一个使用 HTML 敏捷包的简单、可靠的代码片段,它甚至可以处理格式最不完美、反复无常的 HTML 片段:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(Properties.Resources.HtmlContents);
var text = doc.DocumentNode.SelectNodes("//body//text()").Select(node => node.InnerText);
StringBuilder output = new StringBuilder();
foreach (string line in text)
{
output.AppendLine(line);
}
string textOnly = HttpUtility.HtmlDecode(output.ToString());
使用正则表达式解析 HTML 的情况很少,因为如果没有上下文感知,HTML 就无法正确解析,即使在非传统的正则表达式引擎中提供上下文感知也是非常痛苦的。使用正则表达式可以部分实现,但是需要进行手动验证。
HTML 敏捷包可以为你提供一个健壮的解决方案,这将减少手动修复可能导致畸变的需要,天真地把 HTML 当作一个上下文无关文法。
正则表达式可能在大多数情况下获得您想要的大部分内容,但是在非常常见的情况下它会失败。如果你能找到一个比 HTML 敏捷包更好更快的解析器,那就去做吧,但是请不要让世界陷入更多破碎的 HTML 黑客行为。
/// <summary>
/// Removes all html tags from string and leaves only plain text
/// Removes content of <xml></xml> and <style></style> tags as aim to get text content not markup /meta data.
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string HtmlStrip(this string input)
{
input = Regex.Replace(input, "<style>(.|\n)*?</style>",string.Empty);
input = Regex.Replace(input, @"<xml>(.|\n)*?</xml>", string.Empty); // remove all <xml></xml> tags and anything inbetween.
return Regex.Replace(input, @"<(.|\n)*?>", string.Empty); // remove any tags but not there content "<p>bob<span> johnson</span></p>" becomes "bob johnson"
}