繁体   English   中英

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

[英]Regular Expression to clear attributes from a html tag

我有一个非常简单的reg ex问题。 我的HTML标签如下所示:

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

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

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

像这样使用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中,字符<>不是标签定界符,而是运算符。 一个正则表达式可能会将这些运算符当作标记来匹配,这将完全弄乱文档。

不要使用正则表达式来解析HTML-这不是一个很好的工具 如果您无法控制HTML的传入格式,则尤其如此。

为此,请使用HTML Agility Pack

这是一个.NET代码库,可让您解析“网络外” HTML文件。 该解析器对“真实世界”格式的HTML十分宽容。 对象模型与提出System.Xml的对象模型非常相似,但用于HTML文档(或流)。

如果您的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仍需要格式正确。

通常,不建议使用正则表达式来解析html,但是如果您必须使用它,
对于您的问题,如下所示的方法将起作用。

在此正则表达式中,“ body”与“ span”进行“或”运算。 另请注意,注释将被忽略,因为它们可能会隐藏html。 出于相同的原因考虑脚本。

我将保留注释部分。您必须意识到,脚本可以更改文档的呈现方式,并使用可以隐藏您可能要处理的html的语言构造。 当然,正则表达式不应该这样做。

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

原始正则表达式(修饰符:已扩展,“点包括换行符”)
在C#中,可以命名正则表达式捕获的缓冲区,以便每个OR'd子表达式包含相同的名称。 示例: (?<begin> ..) .. (?<end> ..) | (?<begin> ..) .. (?<end> ..) (?<begin> ..) .. (?<end> ..) | (?<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

以下正则表达式从给定字符串中的所有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?\/?\>

并将尽可能多的元素添加到由|分隔的第一个不匹配组中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM