我有以下情况:
我收到了联属网络网址,需要附加适当的网址参数以用于跟踪目的(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+\=.+)+$");
对于“正常情况”,这些工作正常。
但是还有一个额外的困难 - 请看以下网址:
http:/ /pdt.sampleaffiliate.com/click?a(AAA)p(BBB)prod(CCC)ttid(DDD)url(http:/ /www.example.com/item.asp?param1=EEE¶m2=FFF¶m3=GGG)
在这种情况下,他们在查询字符串中使用name(value)name(value)
表示法,但作为最后一个参数(“url”)的值,还有&name=value&name=value
符号中的另一个URL,这使得它真的很有用正则表达式很难看到,两者中哪一个应该被使用......
对于最后一个示例,我当前的正则表达式在IsMatch(uri.Query)上都返回“true”。
任何想法如何解决这个问题?
提前致谢!
答案 0 :(得分:2)
您可以使用ParseQueryString()
类的静态System.Web.HttpUtility
方法返回NameValueCollection
param&值。
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");
上的文档
答案 1 :(得分:2)
你得到的“困难链接”没有正确的URL编码,所以我怀疑内置的ParseQueryString可能无法正常工作(我认为不幸的是你无法控制)。
您可以使用以下Regex将其解析为多个部分:
^[\?]{1}(\w+\([^\)]+\))+$
a(AAA)
p(BBB)
prod(CCC)
ttid(DDD)
url(http://www.example.com/item.asp?param1=EEE¶m2=FFF¶m3=GGG)
首先使用此正则表达式;如果它返回是匹配使用它。如果失败,则使用ParseQueryString中的build。