解析网址并具有键值对

时间:2012-01-21 14:09:52

标签: c# javascript parsing query-string

我要解析以下网址。

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,公司=测试公司

谢谢, 阿希什

3 个答案:

答案 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。