2016-04-08 4 views
1

私はビデオリストのフィルタを構築しようとしています。私はユーザーがフィルタリングのために選択したすべての値を含む文字列を作成することができました。この時点で、私はこの文字列をURLを介してパラメータとして送信しています。REGEX URL(フィルタ)DECIPHERING

例:http://example.dev/admin#/videos/status:3&site:4&categories:15,2,3&actors:33,5,36&search:Grass%20hopper%20/

注:ユーザーが少ないフィルタを選択することができること注意、したがって パラメータ:status:3&site:4&categories:15,2,3&actors:33,5,36&search:Grass%20hopper%20、異なるが、上記の例では、最大の組み合わせであることができます。

質問:正規表現(JS)を使用してすべてのデータを取得するにはどうすればよいですか?

好ましい結果:['status=3', 'site=4', 'categories=15,2,3', 'actors=33,5,3', 'search=Grass hopper']

これまでのところ、私はこれを入れました:(\w+):(((\d+),)*(\d+)|(\d+))&*しかし、実際にそれをどうしたらいいのか分かりません。

ありがとうございます。

+0

これが、私はそれを作るために本当にわかりません。私はちょうどオンライン正規表現のテスターでいくつかの組み合わせを試しています。 (\(d +)、*(\ d +)|(\ d +))&* – Nemanja

答えて

2

正規表現では、数字は任意のカンマで一致しますが、値はGrass hopperではありません。

あなたは(それが存在しないことができるならば、?数量詞が後に追加されなければならない)、右端/は、文字列の末尾にある最後/.../でKey-Valueを一致させることができます。

使用

\w+:(?!\/\/)[^&]+(?=[^\/]*\/$) 

regex demoを参照してください。

説明

  • \w+: - 1+英数字または下線が:
  • (?!\/\/)[^&]+と続く - &以外1+文字が、(http://に一致avoijdする)//で始まらない
  • (?=[^\/]*\/$) - 私たちが最後に/.../の中にいることを確認するための肯定的な先読み。

var re = /\w+:(?!\/\/)[^&]+(?=[^\/]*\/$)/g; 
 
var str = 'http://example.dev/admin#/videos/status:3&site:4&categories:15,2,3&actors:33,5,36&search:Grass hopper /'; 
 
var res= str.match(re); 
 
if (res) { 
 
    res = res.map(function (x) {return x.replace(":", "=")}); 
 
    document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>"; 
 
}

別の解決策video/demo

videos\/([^\/]+) 

後にURLの一部を取得し、&match[1]を分割のみに正規表現を使用することです:

たぶん

var re = /videos\/([^\/]+)/; 
 
var str = 'http://example.dev/admin#/videos/status:3&site:4&categories:15,2,3&actors:33,5,36&search:Grass hopper /'; 
 
var m = str.match(re); 
 
var res = []; 
 
if (m) { 
 
    res = m[1].split("&"); 
 
    res = res.map(x => x.replace(":", "=")); 
 
    document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>"; 
 
}

+0

これは素晴らしい動作です。 ':'だけを '='に置き換えることができます。結果は[status = 3、 "site = 4"、 "categories = 15,2,3"、 "actors = 33,5,36"、 "search = Grass hopper"]のようになります。 – Nemanja

+0

あなたが入力に持っているものを変換する必要がありますか?配列内のすべての項目を変更するには、 'replace'を内側にした' map'を追加してください。 –

+1

これは今、完璧に動作します、ありがとうございます。 – Nemanja