【问题标题】:Remove style from HTML Tags using Regex C#使用 Regex C# 从 HTML 标签中删除样式
【发布时间】:2014-10-08 00:33:09
【问题描述】:

我想使用 C# 从 HTML 标签中删除样式。它应该只返回 HTML 简单标签。

对于即 如果String = <p style="margin: 15px 0px; padding: 0px; border: 0px; outline: 0px;">Hello</p> 然后它应该返回String = <p>Hello</p>

就像所有 HTML 标签一样,<strong></string>, <b></b> 等等。

请帮帮我。

【问题讨论】:

  • 您是否(不小心)错过了结束语?
  • @RobP.,是的,对不起。更新帖子。
  • 可能是因为这个问题已经被问了一百万次了。

标签: c# html


【解决方案1】:

首先,正如其他人所建议的,使用适当的 HTML 解析器的方法是much better。使用HtmlAgilityPackCsQuery

如果你真的想要一个正则表达式解决方案,这里是:

替换此模式:(<.+?)\s+style\s*=\s*(["']).*?\2(.*?>)
与:$1$3

演示:http://regex101.com/r/qJ1vM1/1


要删除多个属性,因为您使用的是 .NET,所以应该可以:

替换(?<=<[^<>]+)\s+(?:style|class)\s*=\s*(["']).*?\1
使用空字符串

【讨论】:

  • 正则表达式工作正常。但是在代码中,它显示错误unrecognized escape sequence,因为字符串中的“。我该怎么办???我将它用作@"(<.+?)\s+style\s*=\s*(["']).*?\2(.*?>)", "")
  • 请注意,它不适用于其他标签,例如 '
      Endoderm ' 该怎么办?
  • 而且我还想删除class,所以我会制作另一个与样式相同的正则表达式吗?
  • @CSAT 它对我有用,所以请展示你是如何使用它的,这样我就可以告诉你出了什么问题。如果您还想删除 class,请参阅我的编辑。
【解决方案2】:

正如其他人所说,您可以使用 HTML Agility pack,它有一个很好的工具:HTML Agility Pack test,它可以显示您正在做什么。

除此之外,它是正则表达式,通常不建议使用 HTML,或者只是在所有字符上循环运行在您的代码上。如果它以< 开头,则读取直到空白,然后删除所有字符直到>。这应该可以解决大多数基本情况,但您必须对其进行测试。

这里有一个小sn-p可以做到这一点:

void Main()
{
    // your input
    String input = @"<p style=""margin: 15px 0px; padding: 0px; border: 0px; outline: 0px;"">Hello</p>";
    // temp variables
    StringBuilder sb = new StringBuilder();
    bool inside = false;
    bool delete = false;
    // analyze string
    for (int i = 0; i < input.Length; i++)
    {
        // Special case, start bracket
        if (input[i].Equals('<')) { 
            inside = true;
            delete = false;
        }
        // special case, close bracket
        else if (input[i].Equals('>')) {
            inside = false;
            delete = false;
        }
        // other letters
        else if (inside) {
            // Once you have a space, ignore the rest until closing bracket
            if (input[i].Equals(' '))
                delete = true;
        }   
        // add if needed
        if (!delete)
                sb.Append(input[i]);
    }
    var result = sb.ToString(); // -> holds: "<p>Hello</p>"
}

【讨论】:

  • 这样会失败
  • 如果里面有 这也会失败,例如K_B \cap\left \{ |k|
  • @MonsterMMORPG 是的。会的。
【解决方案3】:

在将 Outlook 消息保存到数据库之前,我通常使用以下代码从 Outlook 消息中删除内联样式、类、图像和 cmets:

    desc = Regex.Replace(desc, "(<style.+?</style>)|(<script.+?</script>)", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    desc = Regex.Replace(desc, "(<img.+?>)", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    desc = Regex.Replace(desc, "(<o:.+?</o:.+?>)", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    desc = Regex.Replace(desc, "<!--.+?-->", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    desc = Regex.Replace(desc, "class=.+?>", ">", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    desc = Regex.Replace(desc, "class=.+?\s", " ", RegexOptions.IgnoreCase | RegexOptions.Singleline);

【讨论】:

  • 您的class=.+?&gt; 正则表达式模式删除了class= 和下一个&gt; 之间的所有内容,这超出了您的要求。 class=.+?\" 可能就是你想要的。
  • 他应该使用class=".+?"class='.+?' 而不是class=.+?&gt;
【解决方案4】:

所有答案都很好,但也可以使用以下方法简单地完成: "你的 HTML 字符串".replace("style", "data-tags"); 你也可以用同样的方法替换“class”。

【讨论】:

    【解决方案5】:
       source = Regex.Replace(source, "(<style.+?</style>)|(<script.+?</script>)", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
       source = Regex.Replace(source, "(<img.+?>)", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
       source = Regex.Replace(source, "(<o:.+?</o:.+?>)", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
       source = Regex.Replace(source, "<!--.+?-->", "", RegexOptions.IgnoreCase | RegexOptions.Singleline);
       source = Regex.Replace(source, "class=.+?>", ">", RegexOptions.IgnoreCase | RegexOptions.Singleline);
       source = Regex.Replace(source.Replace(System.Environment.NewLine, "<br/>"), "<[^(a|img|b|i|u|ul|ol|li)][^>]*>", " ");
    

    【讨论】:

    • 我可以请求您在源代码周围添加一些上下文。仅代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者都有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多