【问题标题】:How to clean HTML tags using C#如何使用 C# 清理 HTML 标签
【发布时间】:2010-11-05 12:33:26
【问题描述】:

例如:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>title</title>
</head>
<body>
    <a href="aaa.asp?id=1"> I want to get this text </a>
    <div>
        <h1>this is my want!!</h1>
        <b>this is my want!!!</b>
    </div>
</body>
</html>

结果是:

 I want to get this text 
this is my want!!
this is my want!!!

【问题讨论】:

  • 他基本上想序列化它看起来像的 HTML... 只是去掉所有标记,只留下数据。
  • 与问题无关,但您绝对应该知道:结束标签中有一个“/”。例如,“

    这是我想要的!!

    ” - 注意“”。
  • @Samir - 我相信这里的重点也是为了迎合格式错误的 html - 而不仅仅是 xhtml。
  • @Marc Gravell - 是的,这就是重点
  • 使用此链接回答您的问题stackoverflow.com/questions/19523913/…

标签: c# html


【解决方案1】:

HTML Agility Pack:

    HtmlDocument doc = new HtmlDocument();
    doc.LoadHtml(html);
    string s = doc.DocumentNode.SelectSingleNode("//body").InnerText;

【讨论】:

  • HtmlDocument 没有构造函数,并且不包含方法 LoadHtml() 或属性 DocumentNode...我正在 VC2010 中尝试此代码,您能帮帮我吗?
  • @Ahmy 你确定你使用的是敏捷包吗?
  • 噢噢噢噢!对不起先生,我没有包括敏捷包参考...谢谢马克
  • 我在应用您的代码时遇到了另一个问题,即 apersand(&)、@nbsp、gt 和 lt 字符仍然存在,并导致我的文本不正确,我该如何消除这些字符
  • Mr.Marc 我已经禁止提问,这是最近的......当我阅读此错误消息时,我发现我没有提交任何禁止规则我怎么能问我的问题??这是道德的方式吗?
【解决方案2】:

使用此功能...

public string Strip(string text)
{
    return Regex.Replace(text, @"<(.|\n)*?>", string.Empty);
}

【讨论】:

  • 一个更好的正则表达式是&lt;[^&gt;]*&gt;,因为? 让它变得很慢。
  • Ick,这个问题在 SO 中重复了很多次,同样的错误答案也重复了很多次。正如我在另一篇相同的帖子中已经说过的:“你不应该使用正则表达式来解析像 HTML 这样的上下文无关语法。如果 HTML 是由某个外部实体提供的,那么它可以很容易地被操纵以逃避你的正则表达式。”
  • @mehaase,直到那天(2013 年 3 月),我在一些代码中使用了这个解析。但实际上我使用库“HtmlAgilityPack”。
【解决方案3】:

我建议使用类似HTMLTidy.

Here's a tutorial 让您开始。

【讨论】:

    【解决方案4】:

    为什么要做服务器端?

    为此,您必须创建容器元素runat="server",然后获取元素的innerText

    您可以在 javascript 中执行相同的操作,而无需使元素 runat="server"

    【讨论】:

    • 我正在开发一个新闻系统,我想截取一些新闻内容作为首页显示的摘要
    【解决方案5】:

    如果您只想删除 html 标签,请使用删除“”之间的任何内容的正则表达式。

    【讨论】:

    • 我有点担心正则表达式太慢了
    【解决方案6】:

    您可以从下面这个简单的功能开始。 免责声明:此代码适用于基本 HTML,但不会处理所有有效的 HTML 情况和边缘情况。引号内的标记就是一个示例。此代码的优点是您可以轻松地在调试器中跟踪执行,并且可以轻松修改它以适应特定于您的边缘情况。

    public static string RemoveTags(string html)
        {
            string returnStr = "";
            bool insideTag = false;
            for (int i = 0; i < html.Length; ++i)
            {
                char c = html[i];
                if (c == '<')    
                    insideTag = true;
                if (!insideTag)
                    returnStr += c;
                if (c == '>')         
                    insideTag = false;
            }
            return returnStr;        
        }
    

    【讨论】:

    • 这基本上只是上面正则表达式答案的展开版本,因此它不再强大。例如,这很容易被包含“>”的带引号的属性所抛弃,更不用说像这里这样的病态情况了:stackoverflow.com/questions/5175840/….
    • 会通过&lt;div title="x&lt;4&gt;" id="vectorizer"&gt; text here &lt;img class="foo"&gt; text there&lt;/div&gt;吗?
    • @Annie 不幸的是,它不适用于包含在引号中的标签。您可以对其进行修改以捕获这些类型的边缘情况。
    猜你喜欢
    • 2011-05-04
    • 2012-06-28
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2018-06-19
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多