如何在.NET中去除文本中的HTML标记?

11

我有一个包含TinyMCE框的asp.net网页,用户可以格式化文本并将HTML发送到数据库中进行存储。

在服务器端,我想要从文本中剥离HTML,以便只将文本存储在全文索引列中进行搜索。

使用jQuery的text()函数在客户端上剥离HTML非常容易,但我真的更愿意在服务器端执行此操作。是否有任何现有的工具可用于此?

编辑

请参见我的答案。

编辑2

alt text http://tinyurl.com/sillychimp


如果你只是要剥离所有格式,为什么要使用TinyMCE? - Josh Stodola
1
我正在存储TinyMCE生成的HTML,以便向用户呈现格式化后的文本。我将在另一列中存储剥离了HTML标签的文本以供全文搜索。我认为对包含大量HTML的列进行全文索引/搜索不是一个好主意。我没有在原始问题中包含这些细节,因为它与我的问题无关。 - Ronnie Overby
3
谢谢让我笑了,这只猴子加一。 - Andre Pena
9个回答

13

我下载了 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对你的回答的评论。 - Ronnie Overby
我看到了。我想我会坚持我已经写的5行代码。 - Ronnie Overby

8

1
更好的想法是使用HTML解析器。 - mkoryak
为什么要复杂的正则表达式,简单的正则就能完成任务? - riotera
@mkoryak:您能否解释一下为什么这样做会更好? - Mr. Smith
3
这将去除标签但保留实体HTML编码,因此它并不是一个完整的答案。 - richardtallent
2
补充一下richardtallent所说的:格式不正确的HTML可能会破坏正则表达式并导致它剥离不应该剥离的内容。完整的HTML解析器旨在适应格式不正确的HTML,以便您不会丢失数据或获得“额外”的数据。 - Dan Herbert
我认为,如果您有一个格式不正确的HTML,一个好的解决方案是在存储之前修复它(使用HTML Tidy)。一个格式不正确的HTML可能会破坏您的布局,具体取决于您在哪里显示它。 - riotera

4
TextReader tr = new StreamReader(@"Filepath");
string str = tr.ReadToEnd();     
str= Regex.Replace(str,"<(.|\n)*?>", string.Empty);

但是你需要引用一个命名空间,例如:

system.text.RegularExpressions

只需将这个逻辑应用于您的网站


RegEx并不是解析RegEx的理想选择。请参考RioTera答案下的评论,简而言之,如果您有格式不正确的HTML,RegEx将会剥离错误的数据。 - psubsee2003
1
@psubsee2003的回答只是链接到一个推荐完全相同正则表达式的答案;有一天这个链接会失效,我们很幸运这个回答中包含了这个正则表达式。这才是更好的答案。 - Chris Moschini
@ChrisMoschini 我从未说过那个答案更好。我是说看看那个答案下面的评论。 - psubsee2003

2

这里是他如何平衡标签的方法,以便您不会出现某人的用户内容关闭您页面上未打开的 div:http://refactormycode.com/codes/360-balance-html-tags - StriplingWarrior

0

您可以使用HTQL COM,并使用以下查询来查询源代码:

<body> &tx

0

你可以:

  • 使用普通的TEXTAREA(进行高度/宽度/字体等样式设置),而不是TinyMCE。
  • 使用TinyMCE内置的配置选项来清除不需要的HTML代码。
  • 在服务器上使用HtmlDecode(RegEx.Replace(mystring,“<[^>]+>”,“”))。

0

由于系统中可能存在格式不正确的HTML:可以使用BeautifulSoup或类似工具。

它是用Python编写的;我不确定如何进行接口处理 - 是否可以使用.NET语言IronPython?


0
你可以使用类似这样的代码:
string strwithouthtmltag;    
strwithouthtmltag = Regex.Replace(strWithHTMLTags, "<[^>]*>", string.Empty)

0

如果您只是为了索引而存储文本,那么您可能希望做更多的事情,而不仅仅是删除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);
    }

这是旧的代码,我相信它可以进行优化(也许使用编译过的正则表达式?)。但它确实可以运行并可能有所帮助...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接