你如何将Html转换为纯文本?

我有一个存储在表格中的Html代码片段。 不是整个页面,没有标签或类似的东西,只是基本的格式。

我希望能够在给定的页面(实际上仅仅是前30-50个字符,但这是容易的一点)显示该HTML作为仅文本, 没有格式

如何将该文本中的“文本”作为直接文本放入string中?

所以这段代码。

<b>Hello World.</b><br/><p><i>Is there anyone out there?</i><p> 

变为:

你好,世界。 那里有人吗?

如果你正在谈论标签剥离,那么如果你不必担心像<script>标签这样的事情,那就相对简单一些。 如果您只需要显示没有标签的文本,您可以使用正则expression式来完成:

 <[^>]*> 

如果你不必担心<script>标签等,那么你需要一些比正则expression式更强大的function,因为你需要跟踪状态,更像是一个上下文无关语法(CFG)。 虽然你可以用“从左到右”或者非贪婪的匹配来完成它。

如果你可以使用正则expression式,那么很多网页都有很好的信息:

如果你需要一个CFG的更复杂的行为,我会build议使用第三方工具,不幸的是,我不知道一个好的build议。

自由和开源的HtmlAgilityPack 在其样本中有一个从HTML转换为纯文本的方法。

 var plainText = ConvertToPlainText(string html); 

为它提供一个HTMLstring

<b> hello world!</ b> <br /> <i>是我! !</ I>

你会得到一个纯文本的结果,如:

 hello world! it is me! 

我无法使用HtmlAgilityPack,所以我为自己写了第二个最好的解决scheme

 private static string HtmlToPlainText(string html) { const string tagWhiteSpace = @"(>|$)(\W|\n|\r)+<";//matches one or more (white space or line breaks) between '>' and '<' const string stripFormatting = @"<[^>]*(>|$)";//match any character between '<' and '>', even when end tag is missing const string lineBreak = @"<(br|BR)\s{0,1}\/{0,1}>";//matches: <br>,<br/>,<br />,<BR>,<BR/>,<BR /> var lineBreakRegex = new Regex(lineBreak, RegexOptions.Multiline); var stripFormattingRegex = new Regex(stripFormatting, RegexOptions.Multiline); var tagWhiteSpaceRegex = new Regex(tagWhiteSpace, RegexOptions.Multiline); var text = html; //Decode html specific characters text = System.Net.WebUtility.HtmlDecode(text); //Remove tag whitespace/line breaks text = tagWhiteSpaceRegex.Replace(text, "><"); //Replace <br /> with line breaks text = lineBreakRegex.Replace(text, Environment.NewLine); //Strip formatting text = stripFormattingRegex.Replace(text, string.Empty); return text; } 

HTTPUtility.HTMLEncode()是为了将HTML标记作为string来处理。 它会照顾你所有的重担。 从MSDN文档 :

如果在HTTPstream中传递空格和标点符号,则可能会在接收端误解。 HTML编码将HTML中不允许的字符转换为与字符实体等价的字符; HTML解码反转编码。 例如,当embedded在文本块中时,字符<>被编码为&lt;&gt; 用于HTTP传输。

HTTPUtility.HTMLEncode()方法,详细在这里 :

 public static void HtmlEncode( string s, TextWriter output ) 

用法:

 String TestString = "This is a <Test String>."; StringWriter writer = new StringWriter(); Server.HtmlEncode(TestString, writer); String EncodedString = writer.ToString(); 

要添加到vfilby的答案,您可以在您的代码中执行RegExreplace; 没有新的类是必要的。 如果像我这样的其他新手绊倒这个问题。

 using System.Text.RegularExpressions; 

然后…

 private string StripHtml(string source) { string output; //get rid of HTML tags output = Regex.Replace(source, "<[^>]*>", string.Empty); //get rid of multiple blank lines output = Regex.Replace(output, @"^\s*$\n", string.Empty, RegexOptions.Multiline); return output; } 

在HtmlAgilityPack中没有名称为“ConvertToPlainText”的方法,但是可以将htmlstring转换为CLEARstring:

 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(htmlString); var textString = doc.DocumentNode.InnerText; Regex.Replace(textString , @"<(.|n)*?>", string.Empty).Replace("&nbsp", ""); 

这对我很有用。 但我不能find一个名为'ConvertToPlainText'IN'HtmlAgilityPack'的方法。

我认为最简单的方法是创build一个“string”扩展方法(基于Richardbuild议的用户):

 using System; using System.Text.RegularExpressions; public static class StringHelpers { public static string StripHTML(this string HTMLText) { var reg = new Regex("<[^>]+>", RegexOptions.IgnoreCase); return reg.Replace(HTMLText, ""); } } 

然后,在程序中的任何“string”variables上使用这个扩展方法:

 var yourHtmlString = "<div class=\"someclass\"><h2>yourHtmlText</h2></span>"; var yourTextString = yourHtmlString.StripHTML(); 

我使用这种扩展方法将HTML格式的注释转换为纯文本,所以它将正确地显示在水晶报表上,而且非常完美!

如果您的数据具有HTML标记,并且要显示它以便人员可以查看标记,请使用HttpServerUtility :: HtmlEncode。

如果您的数据中包含HTML标记,并希望用户看到呈现的标记,则按原样显示文本。 如果文本代表整个网页,请使用IFRAME。

如果您的数据具有HTML标记,并且想要去除标记并仅显示未格式化的文本,请使用正则expression式。

我发现最简单的方法:

 HtmlFilter.ConvertToPlainText(html); 

HtmlFilter类位于Microsoft.TeamFoundation.WorkItemTracking.Controls.dll

该DLL可以在这样的文件夹中find:%ProgramFiles%\ Common Files \ microsoft shared \ Team Foundation Server \ 14.0 \

在VS 2015中,该DLL还需要引用Microsoft.TeamFoundation.WorkItemTracking.Common.dll,位于相同的文件夹中。

取决于你的意思是“html”。 最复杂的情​​况是完整的网页。 这也是最容易处理的,因为您可以使用文本模式的Web浏览器。 请参阅维基百科文章列表网页浏览器,包括文本模式浏览器。 山猫可能是最有名的,但其中一个可能会更好地满足您的需求。

将HTML转换为纯文本的三步过程

首先你需要为HtmlAgilityPack安装Nuget包第二个创build这个类

 public class HtmlToText { public HtmlToText() { } public string Convert(string path) { HtmlDocument doc = new HtmlDocument(); doc.Load(path); StringWriter sw = new StringWriter(); ConvertTo(doc.DocumentNode, sw); sw.Flush(); return sw.ToString(); } public string ConvertHtml(string html) { HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(html); StringWriter sw = new StringWriter(); ConvertTo(doc.DocumentNode, sw); sw.Flush(); return sw.ToString(); } private void ConvertContentTo(HtmlNode node, TextWriter outText) { foreach(HtmlNode subnode in node.ChildNodes) { ConvertTo(subnode, outText); } } public void ConvertTo(HtmlNode node, TextWriter outText) { string html; switch(node.NodeType) { case HtmlNodeType.Comment: // don't output comments break; case HtmlNodeType.Document: ConvertContentTo(node, outText); break; case HtmlNodeType.Text: // script and style must not be output string parentName = node.ParentNode.Name; if ((parentName == "script") || (parentName == "style")) break; // get text html = ((HtmlTextNode)node).Text; // is it in fact a special closing node output as text? if (HtmlNode.IsOverlappedClosingElement(html)) break; // check the text is meaningful and not a bunch of whitespaces if (html.Trim().Length > 0) { outText.Write(HtmlEntity.DeEntitize(html)); } break; case HtmlNodeType.Element: switch(node.Name) { case "p": // treat paragraphs as crlf outText.Write("\r\n"); break; } if (node.HasChildNodes) { ConvertContentTo(node, outText); } break; } } } 

通过上面的课,参考Judah Himango的答案

第三,你需要创build上述类的对象,并使用ConvertHtml(HTMLContent)方法将HTML转换为纯文本而不是ConvertToPlainText(string html);

 HtmlToText htt=new HtmlToText(); var plainText = htt.ConvertHtml(HTMLContent); 

这是我的解决scheme:

 public string StripHTML(string html) { var regex = new Regex("<[^>]+>", RegexOptions.IgnoreCase); return System.Web.HttpUtility.HtmlDecode((regex.Replace(html, ""))); } 

例:

 StripHTML("<p class='test' style='color:red;'>Here is my solution:</p>"); // output -> Here is my solution: 

public static string StripTags2(string html){return html.Replace(“<”,“<”)。Replace(“>”,“>”); }

通过这个你可以在string中全部转义“<”和“>”。 这是你想要的吗?