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

4
我将从最后开始:
在我的C#程序中,我有一个包含HTML的字符串,并且我想要从该字符串中的元素中删除所有内联样式属性(style=".."),以及所有以'abc'开头的类。
即使有些人抱怨,我仍然愿意使用正则表达式来完成这个任务。

(对于那些想要因解析HTML字符串而斥责我的人的解释:
我被迫使用一些不太理想的Web控件来完成我的项目。该控件是设计用于服务器端(即具有postback和所有这些东西),但我需要在ajax调用中使用它。
这意味着我必须在代码中配置它,调用它的Render()方法以获得HTML字符串,并将该字符串传递到客户端,在适当的位置将其插入到DOM中。不幸的是,我无法找到正确的控件配置来阻止它使用这些无用的样式和类进行渲染,因此我被迫手动删除它们。请不要恨我。)

2个回答

10

试试这个:

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

对我没用,源代码和结果相同,没有影响。 - Erçin Dedeoğlu

8

对于任何感兴趣的人- 我已经解决了这个问题,而不使用正则表达式;
相反,我使用了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();
        }

1
让HTML更好 我从中得到了很大的乐趣。感谢您的幽默。 - oledu.com
1
错误:存在多个根元素。第1行,第126个位置。 - Erçin Dedeoğlu
你必须放置一个虚拟根才能工作,但HTML必须完美无缺,否则它将完全无法工作。 HTMLAgilityPack可以解析糟糕的HTML(网络上99.99%的HTML!)。 - MC9000

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