如何从页面上的每个表单元素中删除一个公共属性?

时间:2011-08-22 17:37:58

标签: c# .net html regex

我有一个包含HTML页面响应的字符串变量。它包含数百个标签,包括以下三个html标签:

<tag1 prefix1314030136543="2">
<tag2 prefix131403013654="1" anotherAttribute="432">
<tag3 prefix13140301376543="4">

我需要能够删除任何以“prefix”开头的属性及其值,而不管标记名称如何。最后,我想:

<tag1>
<tag2 anotherAttribute="432">
<tag3>

我正在使用C#。我假设RegEx是解决方案,但我对RegEx很恐怖,并希望有人可以帮助我。

5 个答案:

答案 0 :(得分:3)

请看Html Agility Pack

使用正则表达式:

(?<=<[^<>]*)\sprefix\w+="[^"]"\s?(?=[^<>]*>)

var result = Regex.Replace(s, 
    @"(?<=<[^<>]*)\sprefix\w+=""[^""]""(?=[^<>]*>)", string.Empty);

答案 1 :(得分:0)

RegEx不是解决方案,因为HTML不是常规语言,因此不应使用RegEx解析。我听说过HTML Agility Pack有关解析和使用HTML的好消息。看看吧。

答案 2 :(得分:0)

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(/* your html here */);
foreach (var item in doc.DocumentNode.Descendants()) {
    foreach (var attr in item.Attributes.Where(x =>x.Name.StartsWith("prefix")).ToArray()) {
        item.Attributes.Remove(attr);
    }
}

答案 3 :(得分:0)

这是一种重手法。

    String str = "<tag1 prefix131403013654=\"2\">"; 
            while (str.IndexOf("prefix131403013654=\"") != -1) //At least one still exists...
            {
               int point = str.IndexOf("prefix131403013654=\"");
               int length = "prefix131403013654=\"".Length;

               //need to grab last part now. We know there's a leading double quote and a ending double quote surrounding it, so we find the second quote.
               int secondQuote = str.IndexOf("\"",point + length); //second part is your position
               if (str.Substring(point - 1, 1) == " ")
               {
                  str = str.Replace(str.Substring(point, (secondQuote - point + 1)),"");
               }
            }

编辑了更好的代码。测试后再次编辑,添加+1替换以计算最终报价。有用。基本上你可以在循环中包含这个,这个循环遍历一个数组列表,其中包含所有“删除这些”值。

如果您不知道完整前缀的名称,可以这样更改:

 String str = "<tag1 prefix131403013654=\"2\">"; 
            while (str.IndexOf("prefix") != -1) //At least one still exists...
            {
               int point = str.IndexOf("prefix");

               int firstQuote = str.IndexOf("\"", point);

               int length = firstQuote - point + 1;
               //need to grab last part now. We know there's a leading double quote and a ending double quote surrounding it, so we find the second quote.
               int secondQuote = str.IndexOf("\"",point + length); //second part is your position
               if (str.Substring(point - 1, 1) == " ") //checking if its actually a prefix
               {
                   str = str.Replace(str.Substring(point, (secondQuote - point + 1)),"");
               }
               //Like I said, a very heavy way of doing it.
            }

这将捕获以前缀开头的所有

答案 4 :(得分:0)

html = Regex.Replace(html, @"(?<=<\w+\s[^>]*)\s" + Regex.Escape(prefix) + @"\w+\s?=\s?""[^""]*""(?=[^>]*>)", "");

你看看后面会向前看,然后你会找到前缀##### =“?????”的匹配器。