URL 查询字符串的 C# 正则表达式

标签 c# regex url query-string

我遇到以下情况:

我获得了联属网络 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 表示法,这使得正则表达式很难看到应该使用哪一个......

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

有什么想法可以解决这个问题吗?

提前致谢!

最佳答案

您获得的“困难链接”未正确进行 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 中的构建。

关于URL 查询字符串的 C# 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627199/

相关文章:

c# - 如何使用c#中的程序检查堆栈内存的大小

c# - 如何在不使用安装程序的情况下在 Windows 8 开始屏幕上放置桌面应用程序快捷方式?

c# - 在带有 Visual Studio 的 Windows 上混合 C# 代码和非托管 C++ 代码

regex - 接受不以特定值开头的 5 个数字的 XSD 模式

html - 如何使背景图像 (CSS) 具有响应性?

html - 固定页眉与页内 anchor 重叠

Java 支持从大于 `Int.MAX_VALUE` 的 URL 下载数据 (Url.openConnection())

c# - 使用linq从输入文件中反转文本

ruby - 正则表达式与?被动组内的量词?

mysql - 在MySQL中先按数字然后按字母对记录进行排序