如何从页面上的每个表单元素中去掉一个公共属性
本文关键字:属性 一个 元素 表单 | 更新日期: 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.
}
这将捕获所有以前缀开头的。