使用C#正则expression式删除HTML标记

如何使用C#正则expression式replace/删除所有HTML标记,包括尖括号? 有人可以帮助我的代码?

如前所述,您不应该使用正则expression式来处理XML或HTML文档。 它们不能很好地处理HTML和XML文档,因为没有办法一般地expression嵌套结构。

你可以使用以下。

String result = Regex.Replace(htmlDocument, @"<[^>]*>", String.Empty); 

这将适用于大多数情况下,但会有一些情况下(例如CDATA包含尖括号),这将无法按预期工作。

正确的答案是不要这样做,使用HTML敏捷包 。

编辑添加:

为了无耻地从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()); 

使用正则expression式parsingHTML的情况很less,因为即使在非传统的正则expression式引擎中,如果没有上下文感知,也不能正确parsingHTML。 您可以通过RegEx获得部分path,但您需要进行手动validation。

Html敏捷包可以为您提供一个强大的解决scheme,将减less需要手动修复的错误,可能导致天真地对待HTML作为一个上下文无关语法。

正则expression式大多数时候可能会让你获得大部分时间,但在很常见的情况下会失败。 如果你能find一个比HTML敏捷包更好的parsing器,那就去吧,但是请不要让这个世界变得更加糟糕的HTML hackery。

这个问题太广泛,无法得到明确的答复。 您是否正在讨论从真实世界的HTML文档(如网页)中删除所有标签? 如果是这样,你将不得不:

  • 删除<!DOCTYPE声明或<?xml prolog(如果它们存在)
  • 删除所有的SGML评论
  • 删除整个HEAD元素
  • 删除所有的SCRIPT和STYLE元素
  • 做Grabthar知道什么与FORM和TABLE元素
  • 删除剩下的标签
  • 从CDATA部分删除<![CDATA [和]]>序列,但保留其内容

这只是我的头顶 – 我相信还有更多。 一旦你完成了所有这些,你将会得到一些在一些地方一起运行的文字,句子和段落,而在另一些地方则会有大块无用的空白。

但是,假设你正在使用一个片段,你可以简单地删除所有的标签,这里是我将使用的正则expression式:

 @"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>" 

在他们自己的select中匹配单引号和双引号string足以解决属性值中尖括号的问题。 我没有看到任何需要显式匹配标签内的属性名称和其他东西,就像Ryan的答案中的正则expression式一样。 第一个select处理所有这一切。

如果你想知道那些(?>...)结构,它们是primefaces组 。 他们使正则expression式更高效一些,但是更重要的是,它们可以防止失控回溯,这是您在混合交替和嵌套量词时应该始终注意的事情。 我真的不认为这会成为一个问题,但我知道如果我不提这个问题,别人会这样做。 😉

当然,这个正则expression式并不完美,但它可能和你所需要的一样好。

 Regex regex = new Regex(@"</?\w+((\s+\w+(\s*=\s*(?:"".*?""|'.*?'|[^'"">\s]+))?)+\s*|\s*)/?>", RegexOptions.Singleline); 

资源

@JasonTrue是正确的,剥离HTML标签不应该通过正则expression式来完成。

使用HtmlAgilityPack去除HTML标签非常简单:

 public string StripTags(string input) { var doc = new HtmlDocument(); doc.LoadHtml(input ?? ""); return doc.DocumentNode.InnerText; } 

我想回应杰森的回应,虽然有时你需要天真地parsing一些Html,并拉出文本内容。

我需要用一个富文本编辑器创build的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" } 

尝试正则expression式的方法在这个URL: http : //www.dotnetperls.com/remove-html-tags

 /// <summary> /// Remove HTML from string with Regex. /// </summary> public static string StripTagsRegex(string source) { return Regex.Replace(source, "<.*?>", string.Empty); } /// <summary> /// Compiled regular expression for performance. /// </summary> static Regex _htmlRegex = new Regex("<.*?>", RegexOptions.Compiled); /// <summary> /// Remove HTML from string with compiled Regex. /// </summary> public static string StripTagsRegexCompiled(string source) { return _htmlRegex.Replace(source, string.Empty); } 

用这个..

 @"(?></?\w+)(?>(?:[^>'""]+|'[^']*'|""[^""]*"")*)>" 

添加.+?<[^>]*>并尝试这个正则expression式(基于此 ):

 <[^>].+?> 

c#.net正则expression式演示 在这里输入图像描述

使用此方法删除标签:

 public string From_To(string text, string from, string to) { if (text == null) return null; string pattern = @"" + from + ".*?" + to; Regex rx = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); MatchCollection matches = rx.Matches(text); return matches.Count <= 0 ? text : matches.Cast<Match>().Where(match => !string.IsNullOrEmpty(match.Value)).Aggregate(text, (current, match) => current.Replace(match.Value, "")); }