2012-01-21 13 views
0

次のURLを解析する必要があります。Web 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 

私が欲しいものは、以下に示すように、キーと値のペアを持つことです。

姓= A、部門がITを=開発、会社=テスト会社

部門= IT開発、姓= A、会社=テスト会社

おかげで、 アシシュ

+0

をあなたはJSまたはC#でそれを解析しようとしていますか? –

+0

いずれかが私のために働くでしょう。ありがとう –

答えて

1

A 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]; 
} 
+0

ありがとうございます。しかしそれは私に次の結果を与えた。 args [0] = 'ファーストネーム' args [1] = 'A department'。私は地図のファーストネームがAのみで必要です。 –

+0

@ ashish.chotalia出力は 'args'ではなく' results'にあります。 –

+0

結果、[結果] [結果] [IT開発会社] = "会議室"に結果があります。結果[部門名] = "IT開発"の結果[会社] = "会議室"のような結果が必要です。ありがとう –

0

ここでスタートですC#:

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

MyUrl = HttpUtility.UrlDecode(MyUrl); 

その後、String.Splitを使用することができます。

+0

これは私に "firstname:A department:IT Development Company:Conference Rooms"のような出力を与えます。私はキーの値のペアを持っています。私が持っているものは、これらの値を記入する必要のあるテキストボックスとしてのファーストネーム、部署、会社です。 –

4

あなたのURLを生成するコードを管理している場合は、私はそれをお勧めしますキーと値のペアの間にデリミタを挿入するように変更します。そのままでは、値の終わりと次のキーの開始位置を区別することは難しいです。

ここでは解決策を段階的に示します。

まず、(私はurlStringに存在すると仮定します)あなたのURLからクエリ文字列を抽出します。

それがコード化された方法に、クエリ文字列は、技術的には、単一のキーと値が含まれています原因
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); 
+0

ダグラス、ソリューションをありがとう。私はこれも働いた原因をupvoteします。 –

+1

ありがとう! Dor Shemerは最初に正しいコードを書いたので、彼の答えは受け入れられるようにする価値があります。 – Douglas

関連する問題