如何在 .NET 中从文本中去除 HTML?
Posted
技术标签:
【中文标题】如何在 .NET 中从文本中去除 HTML?【英文标题】:How Can I strip HTML from Text in .NET? 【发布时间】:2010-11-23 20:33:45 【问题描述】:我有一个带有 TinyMCE 框的 asp.net 网页。用户可以格式化文本并将 html 发送到数据库中。
在服务器上,我想从文本中删除 html,这样我就可以只将文本存储在全文索引列中进行搜索。
使用 jQuery 的 text() 函数在客户端剥离 html 是一件轻而易举的事,但我真的更愿意在服务器上这样做。是否有任何现有的实用程序可供我使用?
编辑
看我的回答。
编辑 2
alt text http://tinyurl.com/sillychimp
【问题讨论】:
如果您只是要去除所有格式,为什么还要使用 TinyMCE?! 我正在存储 TinyMCE 生成的 html,以便将格式化的文本呈现给用户。我将把 html 剥离的文本存储在不同的列中以进行全文搜索。我认为全文索引/搜索包含大量 HTML 的列不是一个好主意。我没有在原始问题中包含这些细节,因为它与我的问题无关。 +1 因为这只猴子让我笑了 【参考方案1】:我下载了HtmlAgilityPack并创建了这个函数:
string StripHtml(string html)
// create whitespace between html elements, so that words do not run together
html = html.Replace(">","> ");
// parse html
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
// strip html decoded text from html
string text = HttpUtility.HtmlDecode(doc.DocumentNode.InnerText);
// replace all whitespace with a single space and remove leading and trailing whitespace
return Regex.Replace(text, @"\s+", " ").Trim();
【讨论】:
看看richardtallent对你的回答的评论。 我看到了。我想我会坚持我写的 5 行代码。【参考方案2】:看看这个Strip HTML tags from a string using regular expressions
【讨论】:
一个更好的主意是使用 html 解析器。 为什么用一个简单的正则表达式来完成这项工作? @mkoryak:你能解释一下为什么会更好吗? 这会去除标签,但会留下 HTML 编码的实体,所以这并不是一个完整的答案。 补充一下richardtallent所说的:格式错误的HTML可以破坏正则表达式并导致它剥离不应该的东西。完整的 HTML 解析器旨在适应格式错误的 HTML,因此您不会丢失数据或获得“额外”数据。【参考方案3】:这是 Jeff Atwood 的 Sanitize HTML method 的 RefactorMe 代码链接
【讨论】:
他是这样平衡标签的,这样你就不会因为某人的用户内容而关闭你页面上没有打开的 div:refactormycode.com/codes/360-balance-html-tags【参考方案4】:TextReader tr = new StreamReader(@"Filepath");
string str = tr.ReadToEnd();
str= Regex.Replace(str,"<(.|\n)*?>", string.Empty);
但您需要引用一个命名空间,即:
system.text.RegularExpressions
仅为您的网站采用此逻辑
【讨论】:
RegEX 不是解析 RegEx 的理想选择。请参阅 RioTera 答案的 cmets,但如果您的 HTML 格式不正确,RegEx 将删除错误的数据。 @psubsee2003 riotera 只是链接到一个推荐完全相同的正则表达式的答案;有一天这个链接会死掉,我们会很幸运这个答案中有正则表达式。这是更好的答案。 @ChrisMoschini 我从来没有说过答案更好。我说看那个答案下的cmets。【参考方案5】:如果您只是存储用于索引的文本,那么您可能想要做的不仅仅是删除 HTML,例如忽略停用词和删除短于(例如)3 个字符的词。然而,我曾经写过的一个简单的标签和剥离器是这样的:
public static string StripTags(string value)
if (value == null)
return string.Empty;
string pattern = @"&.1,8;";
value = Regex.Replace(value, pattern, " ");
pattern = @"<(.|\n)*?>";
return Regex.Replace(value, pattern, string.Empty);
它很旧,我确信它可以优化(也许使用编译的 reg-ex?)。但它确实有效并且可能会有所帮助......
【讨论】:
【参考方案6】:你可以:
使用普通的旧 TEXTAREA(样式为高度/宽度/字体/等)而不是 TinyMCE。 使用 TinyMCE 的内置配置选项去除不需要的 HTML。 在服务器上使用 HtmlDecode(RegEx.Replace(mystring, "]+>", ""))。【讨论】:
【参考方案7】:您可能在系统中使用了格式错误的 HTML:BeautifulSoup 或类似的可以使用。
它是用 Python 编写的;我不确定它是如何接口的 - 使用 .NET 语言 IronPython?
【讨论】:
【参考方案8】:您可以使用 HTQL COM,并通过查询来查询源: &tx;
【讨论】:
【参考方案9】:你可以使用这样的东西
string strwithouthtmltag;
strwithouthtmltag = Regex.Replace(strWithHTMLTags, "<[^>]*>", string.Empty)
【讨论】:
以上是关于如何在 .NET 中从文本中去除 HTML?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Perl 中从 HTML 中提取 URL 和链接文本?
如何在 ruby 中从 net//smtp 发送电子邮件中的 HTML 内容?