从HTML字符串中删除所有内联样式和(大多数)类

时间:2013-12-25 14:09:35

标签: c# html regex parsing html-parsing

我将从头开始:
在我的C#程序中,我有一个包含HTML的字符串,我想从这个字符串中的元素中删除所有内联样式属性(style=".."),以及所有以'abc'开头的类。
我愿意为此使用正则表达式,即使some people bitch about it :)。

(对于那些希望谴责我解析HTML字符串的人的解释:
我不得不为我的项目使用一些不太理想的Web控件。控件设计用于服务器端(即回发和所有东西),但我需要在ajax调用中使用它。
这意味着我必须在代码中配置它,调用它的Render()方法,它给我HTML字符串,并将该字符串传递给客户端,在那里它被插入到适当位置的DOM中。不幸的是,我无法找到控件的正确配置来阻止它使用这些无用的样式和类来呈现自身,所以我不得不手动删除它们。请不要恨我。)

2 个答案:

答案 0 :(得分:9)

试试这个:

string html;
string cleaned = new Regex("style=\"[^\"]*\"").Replace(html, "");
string cleaned = new Regex("(?<=class=\")([^\"]*)\\babc\\w*\\b([^\"]*)(?=\")").Replace(cleaned, "$1$2");

答案 1 :(得分:7)

对任何有兴趣的人 - 我在不使用RegEx的情况下解决了这个问题; 相反,我使用XDocument来解析html-

private string MakeHtmlGood(string html)
        {
            var xmlDoc = XDocument.Parse(html);
            // Remove all inline styles
            xmlDoc.Descendants().Attributes("style").Remove();

            // Remove all classes inserted by 3rd party, without removing our own lovely classes
            foreach (var node in xmlDoc.Descendants())
            {
                var classAttribute = node.Attributes("class").SingleOrDefault();
                if (classAttribute == null)
                {
                    continue;
                }
                var classesThatShouldStay = classAttribute.Value.Split(' ').Where(className => !className.StartsWith("abc"));
                classAttribute.SetValue(string.Join(" ", classesThatShouldStay));

            }

            return xmlDoc.ToString();
        }