如何从页面上的每个表单元素中去掉一个公共属性

本文关键字:属性 一个 元素 表单 | 更新日期: 2023-09-27 18:06:16

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

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

我需要能够去掉任何以"前缀"及其值开头的属性,而不管标签名称如何。最后,我想要:

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

我正在使用C#。我认为RegEx是解决方案,但我对RegEx很反感,希望有人能帮助我。

如何从页面上的每个表单元素中去掉一个公共属性

查看Html敏捷包。

使用正则表达式:

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

RegEx不是解决方案,因为HTML不是常规语言,因此不应该使用RegEx进行解析。我听说了一些关于HTML敏捷包的好东西,用于解析和处理HTML。看看吧。

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);
    }
}
html = Regex.Replace(html, @"(?<=<'w+'s[^>]*)'s" + Regex.Escape(prefix) + @"'w+'s?='s?""[^""]*""(?=[^>]*>)", "");

你看看后面和前面就会发现,然后你就有了前缀#####="????"的匹配器。

这是一个很难做到的方法。

    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.
            }

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