如何从ASP.NET中的string中去除HTML标签?

使用ASP.NET,我怎样才能从给定的string可靠地去除HTML标签(即不使用正则expression式)? 我正在寻找像PHP的strip_tags

例:

<ul><li>Hello</li></ul>

输出:

“你好”

我试图不重新发明轮子,但是到目前为止我还没有发现任何符合我需要的东西。

如果只是从一个string中剥离所有的 HTML标签,那么它也可以正确使用正则expression式。 更换:

 <[^>]*(>|$) 

与全球的空string。 之后不要忘记正常化string,replace:

 [\s\r\n]+ 

只有一个空间,并修剪结果。 可选地将任何HTML字符实体replace回实际的字符。

注意

  1. 有一个限制:HTML和XML允许>属性值。 遇到这样的值时,此解决scheme返回损坏的标记。
  2. 该解决scheme在技术上是安全的,如下所示:结果将永远不会包含可用于执行跨站点脚本或破坏页面布局的任何内容。 这不是很干净。
  3. 与所有的HTML和正则expression式一样:
    如果你必须在所有情况下都正确使用它,请使用合适的parsing器 。

去下载HTMLAgilityPack,现在! ;) 下载LInk

这使您可以加载和parsingHTML。 然后,您可以浏览DOM并提取所有属性的内部值。 严重的是,这将最多需要10行代码。 它是那里最大的免费.net库之一。

这是一个示例:

  string htmlContents = new System.IO.StreamReader(resultsStream,Encoding.UTF8,true).ReadToEnd(); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(htmlContents); if (doc == null) return null; string output = ""; foreach (var node in doc.DocumentNode.ChildNodes) { output += node.InnerText; } 
 Regex.Replace(htmlText, "<.*?>", string.Empty); 
 protected string StripHtml(string Txt) { return Regex.Replace(Txt, "<(.|\\n)*?>", string.Empty); } Protected Function StripHtml(Txt as String) as String Return Regex.Replace(Txt, "<(.|\n)*?>", String.Empty) End Function 

我已经发布了这个在asp.net论坛上,它似乎仍然是最简单的解决scheme之一。 我不能保证它是最快或最有效的,但它是非常可靠的。 在.NET中,您可以使用HTML Web Control对象本身。 所有你真正需要做的就是将你的string插入一个临时的HTML对象,如DIV,然后使用内置的“InnerText”来抓取标签中没有包含的所有文本。 看下面的一个简单的C#示例:

 System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div"); htmlDiv.InnerHtml = htmlString; String plainText = htmlDiv.InnerText; 

我写了一个相当快的方法在C#中击败了正则expression式的地狱。 它在CodeProject 的一篇文章中被托pipe。

它的优点是性能更好,能够replace命名和编号的HTML实体(如&amp;amp; &203; &amp;amp; &203; &amp;amp;

请阅读CodeProject上的相关文章 。

谢谢。

 string result = Regex.Replace(anytext, @"<(.|\n)*?>", string.Empty); 

对于那些不能使用HtmlAgilityPack的人来说,.NET的XML读取器是一个选项。 这可能会失败格式良好的HTML尽pipe如此总是添加regx作为备份的捕获。 请注意,这并不是很快,但是它通过debugging提供了一个很好的机会。

 public static string RemoveHTMLTags(string content) { var cleaned = string.Empty; try { StringBuilder textOnly = new StringBuilder(); using (var reader = XmlNodeReader.Create(new System.IO.StringReader("<xml>" + content + "</xml>"))) { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Text) textOnly.Append(reader.ReadContentAsString()); } } cleaned = textOnly.ToString(); } catch { //A tag is probably not closed. fallback to regex string clean. string textOnly = string.Empty; Regex tagRemove = new Regex(@"<[^>]*(>|$)"); Regex compressSpaces = new Regex(@"[\s\r\n]+"); textOnly = tagRemove.Replace(content, string.Empty); textOnly = compressSpaces.Replace(textOnly, " "); cleaned = textOnly; } return cleaned; } 

对于那些对Michael Tiptop的解决scheme无法正常工作的人来说,下面是.Net4 +的方法:

 public static string StripTags(this string markup) { try { StringReader sr = new StringReader(markup); XPathDocument doc; using (XmlReader xr = XmlReader.Create(sr, new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Fragment // for multiple roots })) { doc = new XPathDocument(xr); } return doc.CreateNavigator().Value; // .Value is similar to .InnerText of // XmlDocument or JavaScript's innerText } catch { return string.Empty; } } 
 using System.Text.RegularExpressions; string str = Regex.Replace(HttpUtility.HtmlDecode(HTMLString), "<.*?>", string.Empty); 

我已经看了这里提出的基于正则expression式的解决scheme,除了最微不足道的情况之外,他们不会让我充满信心。 一个属性中的尖括号就是所有需要打破的,更不用说疯狂的HTML格式了。 那么像&amp; ? 如果要将HTML转换为纯文本,则还需要解码实体。

所以我提出下面的方法。

使用HtmlAgilityPack ,这种扩展方法可以有效地去除HTML片段中的所有HTML标签。 还解码HTML实体,如&amp; 。 只返回内部文本项目,在每个文本项目之间换行。

 public static string RemoveHtmlTags(this string html) { if (String.IsNullOrEmpty(html)) return html; var doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null) { return WebUtility.HtmlDecode(html); } var sb = new StringBuilder(); var i = 0; foreach (var node in doc.DocumentNode.ChildNodes) { var text = node.InnerText.SafeTrim(); if (!String.IsNullOrEmpty(text)) { sb.Append(text); if (i < doc.DocumentNode.ChildNodes.Count - 1) { sb.Append(Environment.NewLine); } } i++; } var result = sb.ToString(); return WebUtility.HtmlDecode(result); } public static string SafeTrim(this string str) { if (str == null) return null; return str.Trim(); } 

如果你真的认真,你也想忽略某些HTML标签的内容( <script><style><svg><head><object> ),因为它们可能不会包含我们所追求的可读内容。 你在那里做什么取决于你的情况和你想要走多远,但是使用HtmlAgilityPack对白名单或者黑名单标签来说是相当简单的。

如果要将内容呈现回HTML页面,请确保您了解XSS漏洞以及如何防止 XSS漏洞,即始终对任何用户input的文本进行编码,然后将其重新渲染回HTML页面( >变为&gt;等)。

对于第二个参数,即保留一些标签,您可能需要使用HTMLagilityPack这样的代码:

 public string StripTags(HtmlNode documentNode, IList keepTags) { var result = new StringBuilder(); foreach (var childNode in documentNode.ChildNodes) { if (childNode.Name.ToLower() == "#text") { result.Append(childNode.InnerText); } else { if (!keepTags.Contains(childNode.Name.ToLower())) { result.Append(StripTags(childNode, keepTags)); } else { result.Append(childNode.OuterHtml.Replace(childNode.InnerHtml, StripTags(childNode, keepTags))); } } } return result.ToString(); } 

有关此页面的更多解释: http : //nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/

只需使用string.StripHTML();