如何在 .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 和链接文本?

如何在 C# 中从 MS Office 文档中提取文本

在 PHP 中从文本到图像

如何在 ruby​​ 中从 net//smtp 发送电子邮件中的 HTML 内容?

如何在 asp.net Web 应用程序中从条码标签打印机打印条码

如何在html中从下到上设置垂直文本?