我有一个包含HTML页面响应的字符串变量。它包含数百个标签,包括以下三个html标签:
<tag1 prefix1314030136543="2">
<tag2 prefix131403013654="1" anotherAttribute="432">
<tag3 prefix13140301376543="4">
我需要能够删除任何以“prefix”开头的属性及其值,而不管标记名称如何。最后,我想:
<tag1>
<tag2 anotherAttribute="432">
<tag3>
我正在使用C#。我假设RegEx是解决方案,但我对RegEx很恐怖,并希望有人可以帮助我。
答案 0 :(得分:3)
使用正则表达式:
(?<=<[^<>]*)\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?""[^""]*""(?=[^>]*>)", "");
你看看后面会向前看,然后你会找到前缀##### =“?????”的匹配器。