正则表达式以清除html标记中的属性

时间:2012-04-25 13:46:02

标签: c# regex

我有一个非常简单的注册问题。我的HTML标记如下所示:

<body lang=EN-US link=blue vlink=purple>

我想清除所有属性,只返回<body>

还有许多其他HTML标记我想清除它们的属性,所以我希望重用该解决方案。如何使用正则表达式执行此操作? 谢谢, 乙

5 个答案:

答案 0 :(得分:6)

像这样使用HtmlAgilityPack

    public string RemoveAllAttributesFromEveryNode(string html)
    {
        var htmlDocument = new HtmlAgilityPack.HtmlDocument();
        htmlDocument.LoadHtml(html);
        foreach (var eachNode in htmlDocument.DocumentNode.SelectNodes("//*"))
            eachNode.Attributes.RemoveAll();
        html = htmlDocument.DocumentNode.OuterHtml;
        return html;
    }

调用此方法传递要从中删除所有属性的html。

将为您提供很多帮助。

不要将正则表达式用于可能包含脚本的html文件,如在Javascript中,字符<>不是标记分隔符,而是运算符。正则表达式可能会匹配这些运算符,就像它们是标记一样,这将完全弄乱文档。

答案 1 :(得分:3)

不要使用正则表达式来解析HTML - 它是not a good tool for this。如果您无法控制HTML的传入格式,则尤其如此。

请改用此HTML Agility Pack

  

它是一个.NET代码库,允许您解析“out of the web”HTML文件。解析器非常容忍“真实世界”格式错误的HTML。对象模型与提出System.Xml非常相似,但对于HTML文档(或流)。

答案 2 :(得分:0)

如果您的HTML没有被无可救药地破坏,并且属性不包含>个符号,那么它就像以下一样简单:

<body.+?>

...如果您想要阻止XSS或其他什么,请忽略它。


如果您的属性可能包含其他符号,那么这是一个完整的示例:

string data = @"<body lang=""EN-US>"" link=blue vlink=purple>";
Regex re = new Regex(@"<(body).*?(""[^""]+""[^"">]+)*>");

Console.WriteLine(re.Replace(data, "<$1>")); // <body>

请注意,HTML仍然需要格式良好。

答案 3 :(得分:0)

一般情况下,不建议使用正则表达式来解析html,但如果必须使用它,则 对于你的问题,下面的东西将起作用。

在这个正则表达式中,'body'与'span'进行OR运算作为示例。另请注意,注释会被忽略,因为它们可能会隐藏html。出于同样的原因考虑脚本。

我会留下评论部分。您必须知道脚本可以改变文档呈现并使用可以隐藏您可能想要处理的html的语言结构。当然,不应该用正则表达式来完成。

如果需要,可以删除'script'子表达式,以期修改包含要更改的内容的可能字符串常量。不推荐。

原始正则表达式(修饰符:扩展,'点包括换行符')
在C#中,可以命名正则表达式捕获的缓冲区,以便每个OR'd子表达式包含相同的名称。示例:(?<begin> ..) .. (?<end> ..) | (?<begin> ..) .. (?<end> ..)
所以替换只是[“开始”] + [“结束”]。这在Perl 5.10中有问题,所以我只使用捕获缓冲区数字,Dot Net可能正常工作。

搜索

 # (1,2)
   ( <!--.*?--> ) ()
|
 # (3,4)
   (
     (?:
        <script
          (?>
             (?:\s+(?:".*?"|'.*?'|[^>]*?)+)?
             \s*
        >
          )(?<!/> )
        .*?
        </script\s*>
      |
        </?script (?:\s+(?:".*?"|'.*?'|[^>]*?)+)? \s*/?>
     )
   ) ()
|
 # (5,6)
   ( <(?:body|span) ) (?!\s*/?>)
    \s+ (?:".*?"|'.*?'|[^>]*?)+ 
   ( /?> )

替换

$1$2$3$4$5$6

答案 4 :(得分:0)

以下正则表达式清除给定字符串中所有HTML / XML节点的属性。

\<[a-z]+\b([^>]+?)\s?\/?\>

作为C#函数,它看起来像这样:

public string RemoveAttributes(string value){
   var attributeClean = new System.Text.RegularExpressions.Regex(@"\<[a-z]+\b([^>]+?)\s?\/?\>", System.Text.RegularExpressions.RegexOptions.Multiline | System.Text.RegularExpressions.RegexOptions.IgnoreCase);

   while (attributeClean.IsMatch(value)) {
      var match = attributeClean.Match(value);
      value = value.Remove(match.Index, match.Length);
   }
   return value;
}

如果只想清除特定元素,可以使用以下正则表达式

\<(?:li|body)([^>]+?)\s?\/?\>

并将多个元素添加到由|分隔的第一个非匹配组中。