Разбор веб-URL и пара ключей-значений - PullRequest
0 голосов
/ 21 января 2012

Я хочу разобрать следующий URL.

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, Отдел = IT Development, Компания = Испытательная Компания

Отдел = Развитие ИТ, FirstName = A, Компания = Испытательная Компания

Спасибо, Ashish

Ответы [ 3 ]

4 голосов
/ 21 января 2012

Если у вас есть контроль над кодом, генерирующим ваши 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 голос
/ 21 января 2012

Решение JS, я бы обобщил его немного подробнее (например, правильно получить значение параметра k url)

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];
}
0 голосов
/ 21 января 2012

Вот начало в C #:

string MyUrl = "http://testurl?k=firstname%3AA%20department%3AIT%20Development%20Company%3ATest%20Company";

MyUrl = HttpUtility.UrlDecode(MyUrl);

После этого вы сможете использовать String.Split.

...