我要解析以下网址。
http://testurl?k=firstname%3AA%20department%3AIT%20Development%20Company%3ATest%20Company
http://testurl?k=department%3AIT%20Development%20firstname%3AA%20Company%3ATest%20Company
%3A =':'
%20 =''
http://testurl?k=firstname:A department:IT Development Company:Test Company
http://testurl?k=department:IT Development firstname:A Company:Test Company
我想要的是拥有键值对,如下所示。
FirstName = A,Department = IT Development,Company = Test Company
部门= IT开发,FirstName = A,公司=测试公司
谢谢, 阿希什
答案 0 :(得分:4)
如果您可以控制生成URL的代码,那么我建议您更改它以在键值对之间引入分隔符。就目前而言,很难区分值结束的位置和下一个键的开始。
以下是逐步解决方案。
首先,从您的URL中提取查询字符串(我将假设它位于urlString
中):
Uri uri = new Uri(urlString);
NameValueCollection outer = HttpUtility.ParseQueryString(uri.Query);
由于编码方式,您的查询字符串在技术上只包含一个键值对,键为k
。其余的键值对在中编码 k
的值。因此,我们将获得该值并对其进行解码:
string k = outer["k"];
string decoded = HttpUtility.UrlDecode(k);
下一部分是最棘手的:提取你的键和值。我们将使用正则表达式来匹配这些:
var matches = Regex.Matches(decoded, @"(?<key>\w+):(?<value>.*?)(?= \w+:|$)");
我们假设您的密钥只包含单词字符(字母,数字和下划线);因此,它们将由(?<key>\w+)
匹配。每个键后跟一个:
字符。接下来,值可以包含任何字符序列(?<value>.*?)
。但是,它们必须由另一个键\w+:
或字符串末尾$
跟随;因此,我们将使用积极的前瞻来匹配其中任何一个。
最后,只需将任何匹配转换为字典:
IDictionary<string, string> dictionary = matches.Cast<Match>().ToDictionary(
m => m.Groups["key"].Value,
m => m.Groups["value"].Value);
结合起来,这会给你:
Uri uri = new Uri(urlString);
NameValueCollection outer = HttpUtility.ParseQueryString(uri.Query);
string k = outer["k"];
string decoded = HttpUtility.UrlDecode(k);
var matches = Regex.Matches(decoded, @"(?<key>\w+):(?<value>.*?)(?= \w+:|$)");
IDictionary<string, string> dictionary = matches.Cast<Match>().ToDictionary(
m => m.Groups["key"].Value,
m => m.Groups["value"].Value);
答案 1 :(得分:1)
JS解决方案,我会更多地概括一下(例如,正确获取k
url param值)
var url = 'http://testurl?k=firstname%3AA%20department%3AIT%20Development%20Company%3ATest%20Company';
var args = unescape(url).split('?k=')[1];
args = args.split(/\s+(?=\w+:)/);
var results = {};
for (i in args) {
keyval = args[i].split(':');
results[keyval[0]] = keyval[1];
}
答案 2 :(得分:0)
这是C#的一个开始:
string MyUrl = "http://testurl?k=firstname%3AA%20department%3AIT%20Development%20Company%3ATest%20Company";
MyUrl = HttpUtility.UrlDecode(MyUrl);
之后你应该能够使用String.Split。