如何从ASP.NET中的字符串中剥离HTML标记?

dan*_*iel 122 html c# regex asp.net string

使用ASP.NET,如何可靠地从给定字符串中剥离HTML标记(即不使用正则表达式)?我正在寻找像PHP这样的东西strip_tags.

例:

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

输出:

"你好"

我试图不重新发明轮子,但到目前为止我还没有找到满足我需求的东西.

Tom*_*lak 110

如果它只是从字符串中剥离所有 HTML标记,那么这也适用于正则表达式.更换:

<[^>]*(>|$)
Run Code Online (Sandbox Code Playgroud)

全局使用空字符串.不要忘记事后标准化字符串,替换:

[\s\r\n]+
Run Code Online (Sandbox Code Playgroud)

使用单个空格,并修剪结果.(可选)将任何HTML字符实体替换回实际字符​​.

注意:

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

  • 虽然没有要求,但我认为很多读者也希望剥离HTM编码,比如`&quote;`.我把它与[`WebUtility.HtmlDecode`](http://stackoverflow.com/questions/122641/how-can-i-decode-html-characters-in-c)结合起来(这反过来又不会删除标签) ).删除标签后使用它,因为它可能会重写`&gt;`和`&lt;`.例如`WebUtility.HtmlDecode(Regex.Replace(myTextVariable,"<[^>]*(> | $)",string.Empty))` (48认同)
  • @YahooSerious这将允许XSS向量然而&gt; 脚本&lt; 警报( "XXS"); &GT;/script&lt; 不会被正则表达式清理,而是由HtmlDecode转换为<script> alert("XXS"); </ script> (3认同)

Ser*_*pth 74

立即下载HTMLAgilityPack!;) 下载LInk

这允许您加载和解析HTML.然后,您可以导航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;
            }
Run Code Online (Sandbox Code Playgroud)

  • 为什么`if(doc == null)`检查?这总是假的,不是这样吗? (16认同)
  • 您甚至可以查询每个`text()`节点,修剪内容和字符串。IEnumerable &lt;string&gt; allText = doc.DocumentNode.SelectNodes(“ // text()”)。Select(n =&gt; n.InnerText.Trim())` (2认同)

use*_*144 64

Regex.Replace(htmlText, "<.*?>", string.Empty);
Run Code Online (Sandbox Code Playgroud)

  • 有许多问题 - 不处理其中包含<或>的属性,并且对于跨越多行的标记不能很好,除非使用`RegexOptions.SingleLine`运行. (4认同)
  • 不,使用“&lt;[^&gt;]*&gt;”。 (2认同)

小智 11

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
Run Code Online (Sandbox Code Playgroud)

  • 不适用于许多情况,包括非unix linebreaks. (2认同)

小智 6

我已经在asp.net论坛上发布了它,它似乎仍然是那里最简单的解决方案之一.我不保证它是最快或最有效的,但它非常可靠.在.NET中,您可以使用HTML Web Control对象本身.您真正需要做的就是将您的字符串插入到临时HTML对象(如DIV)中,然后使用内置的"InnerText"来获取标记中未包含的所有文本.请参阅下面的简单C#示例:


System.Web.UI.HtmlControls.HtmlGenericControl htmlDiv = new System.Web.UI.HtmlControls.HtmlGenericControl("div");
htmlDiv.InnerHtml = htmlString;
String plainText = htmlDiv.InnerText;
Run Code Online (Sandbox Code Playgroud)


And*_*nea 5

我在c#中编写了一个非常快速的方法,它击败了正则表达式.它托管在CodeProject上的一篇文章中.

它的优点是,在更好的性能中,能够替换命名和编号的HTML实体(那些像&amp;amp;&203;)和注释块替换等等.

请阅读CodeProject上相关文章.

谢谢.