用于URL查询字符串的c#正则表达式

本文关键字:正则表达式 字符串 URL 查询 用于 | 更新日期: 2023-09-27 18:14:19

我得到了以下场景:

我得到一个附属网络URL,需要附加一个适当的URL参数用于跟踪目的(subbid)。

实际问题:在某些情况下,甚至一个附属网络支持不同的查询字符串格式。例子:

1) http:/ /impde.sampleaffiliate.com/imp?pop(over)g(XXXXX)a(XXX)subid(subIdValue)

2) http:/ /clkde.sampleaffiliate.com/click?p=XXX&a=XXX&g=XXX&subid=subIdValue

联盟网络的识别是相当简单的[url.Contains("sampleaffiliate")],但要获得查询字符串格式,我使用正则表达式:

//query string parameter values are in brackets, e.g. ?a(12312)b(12343432)c(4242)
Regex parametersInBrackets = new Regex(@"^['?]{1}'w+('(.*'))+$");
//query string parameter values are separated by ampersands and equal signs, e.g. ?a=12312&b=12343432&c=4242
Regex parametersWithAmpersand = new Regex(@"^['?]{1}.+('&'w+'=.+)+$");

这些在"正常情况下"都可以。

但是这里有一个额外的困难-看看下面的URL:

http:/ /pdt.sampleaffiliate.com/click?a(AAA)p(BBB)prod(CCC)ttid(DDD)url(http:/ /www.example.com/item.asp?param1=EEE&param2=FFF&param3=GGG)

在这种情况下,他们在查询字符串中使用name(value)name(value)符号,但作为最后一个参数("url")的值,在&name=value&name=value符号中有另一个url,这使得regex很难看到,两者中哪一个是应该使用的…

对于上一个例子,我当前的正则表达式在IsMatch(uri.Query)上都返回"true"。

有什么办法解决这个问题吗?

提前感谢!

用于URL查询字符串的c#正则表达式

你得到的"困难的链接"是不正确的URL编码,所以我怀疑内置的ParseQueryString可能不会工作(我认为这是不幸的超出了你的控制)。

您可以使用以下Regex将其解析为多个部分:

^['?]{1}('w+'([^')]+'))+$
a(AAA)
p(BBB)
prod(CCC)
ttid(DDD)
url(http://www.example.com/item.asp?param1=EEE&param2=FFF&param3=GGG)

首先使用这个正则表达式;如果它返回的是匹配项,就使用它。如果失败,则使用ParseQueryString中的构建。

您可以使用System.Web.HttpUtility类的静态ParseQueryString()方法返回NameValueCollection作为参数&价值。

Uri myUri = new Uri("http://clkde.sampleaffiliate.com/click?p=XXX&a=XXX&g=XXX&subid=subIdValue");
string param1 = HttpUtility.ParseQueryString(myUri.Query).Get("p");

在http://msdn.microsoft.com/en-us/library/ms150046.aspx查看文档