使用Regex C#从HTML标签中删除样式

时间:2014-08-14 11:13:59

标签: c# html

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

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

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

请帮助我。

5 个答案:

答案 0 :(得分:7)

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

如果你真的想要一个正则表达式解决方案,那么它就是:

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

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


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

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

答案 1 :(得分:0)

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

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

这是一个可以做到的小片段:

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>"
}

答案 2 :(得分:0)

所有答案都很好,但是也可以使用此方法简单地完成它: “您的HTML字符串” .replace(“ style”,“ data-tags”); 您也可以用相同的方式替换“类”。

答案 3 :(得分:-1)

我通常使用以下代码从Outlook邮件中删除内联样式,类,图像和注释,然后将其保存到数据库中:

    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);

答案 4 :(得分:-1)

   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)][^>]*>", " ");