2

我得到了以下场景:

我获得了一个附属网络 URL,并且需要附加一个适当的 URL 参数以用于跟踪目的 (subID)。

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

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,这使得正则表达式很难看到,两者中的哪一个应该是用的...

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

任何想法如何解决这一问题?

提前致谢!

4

2 回答 2

2

您可以使用返回参数和值的类的静态ParseQueryString()方法。System.Web.HttpUtilityNameValueCollection

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查看文档

于 2013-05-18T17:51:38.807 回答
2

你得到的“困难链接”没有正确的 URL 编码,所以我怀疑内置的 ParseQueryString 可能不起作用(我认为这很遗憾是你无法控制的)。

您可以使用以下正则表达式将其解析为片段:

^[\?]{1}(\w+\([^\)]+\))+$

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

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

于 2013-05-18T18:37:22.567 回答