GETパラメータから値を取得するにはどうすればよいですか?


1327

次のようなGETパラメータを含むURLがあります。

www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 

全体の値を取得する必要がありますc。URLを読もうとしたのですが・・・m2。JavaScriptを使用してこれを行うにはどうすればよいですか?


新しい回答を投稿する前に、この質問にはすでに50以上の回答があることを考慮してください。回答が既存の回答に含まれない情報を提供していることを確認してください。
janniks

回答:


1998

JavaScript 自体には、クエリ文字列パラメーターを処理するための組み込み機能はありません。

(モダン)ブラウザーで実行されているコードで、URLオブジェクトを使用できます(これは、ブラウザーがJSに提供するAPIの一部です)。

var url_string = "http://www.example.com/t.html?a=1&b=3&c=m2-m3-m4-m5"; //window.location.href
var url = new URL(url_string);
var c = url.searchParams.get("c");
console.log(c);


古いブラウザ(Internet Explorerを含む)の場合、このポリフィルまたはこの回答の元のバージョンのコードより前のコードを使用できますURL

にアクセスできますlocation.search。これにより、?文字からURLの終わりまで、またはフラグメント識別子(#foo)の始まりのいずれか早い方からアクセスできます。

次に、これを解析できます。

function parse_query_string(query) {
  var vars = query.split("&");
  var query_string = {};
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split("=");
    var key = decodeURIComponent(pair[0]);
    var value = decodeURIComponent(pair[1]);
    // If first entry with this name
    if (typeof query_string[key] === "undefined") {
      query_string[key] = decodeURIComponent(value);
      // If second entry with this name
    } else if (typeof query_string[key] === "string") {
      var arr = [query_string[key], decodeURIComponent(value)];
      query_string[key] = arr;
      // If third or later entry with this name
    } else {
      query_string[key].push(decodeURIComponent(value));
    }
  }
  return query_string;
}

var query_string = "a=1&b=3&c=m2-m3-m4-m5";
var parsed_qs = parse_query_string(query_string);
console.log(parsed_qs.c);

現在のページのURLからクエリ文字列を取得するには、次のようにします。

var query = window.location.search.substring(1);
var qs = parse_query_string(query);

古いブラウザの場合URLに加えてのポリフィルが必要になる場合がありますURLSearchParams。またはvar c = url.searchParams.get("c");、上記の回答の行をに置き換えることで、この問題を回避できますvar c = new URLSearchParams(window.location.search).get("c");
evanrmurphy

parse_query_stringは、base64でエンコードされた値を値として渡す場合など、「=」を含む値に対して失敗します。以下の正規表現を使用したバージョンは、より適切に機能します。
Manel Clos

7
@Jamland —絶対にしないでください。それは物事を壊します。ライブデモ new URL()は、適切にエンコードされたURLを引数として受け取ることを想定しています。URL全体ではなく、URLのコンポーネントdecodeURIComponentが渡されることを期待しています。
クエンティン

@クエンティン私はさまざまな特殊文字をチェックしましたが、あなたが正しいと思います。decodeURIComponentこの場合は使用しないでください
Jamland

1
parse_query_string機能はの二重デコードを行いますvalue=発行@ManelClosで言及した、2番目のパラメータを追加することによって対処することができます2limitへ)vars[i].split()
ジェイク、

242

私が見たほとんどの実装では、名前と値のURLデコードが行われていません。

次に、適切なURLデコードも行う一般的なユーティリティ関数を示します。

function getQueryParams(qs) {
    qs = qs.split('+').join(' ');

    var params = {},
        tokens,
        re = /[?&]?([^=]+)=([^&]*)/g;

    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }

    return params;
}

//var query = getQueryParams(document.location.search);
//alert(query.foo);

3
このコードは機能しません。現在のインデックスをリセットするループ定義で正規表現がコンパイルされるため、無限ループが作成されます。ループの外側の変数に正規表現を入れれば、正しく動作します。
maxhawkins、2011

2
@maxhawkins:一部のブラウザーでは機能しますが、他のブラウザーでは無限ループに入ります。その点であなたは半分正しいです。クロスブラウザになるようにコードを修正します。指摘してくれてありがとう!
Ates Goral

3
@ZiTALこの関数は、URL全体ではなく、URLのクエリ部分で使用されます。以下のコメント化された使用例を参照してください。
Ates Goral 2012

1
@Harveyの大文字と小文字の区別は、クエリパラメータの問題ではありません。クエリパラメータ抽出と一緒に、またはクエリパラメータ抽出の上に適用する必要のあるアプリケーション固有のもののように思えます。
Ates Goral 2016年

7
なぜqs.split('+').join(' ');ありませんかqs.replace(/\+/g, ' ');
FlameStorm 2018

234

ソース

function gup( name, url ) {
    if (!url) url = location.href;
    name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    var regexS = "[\\?&]"+name+"=([^&#]*)";
    var regex = new RegExp( regexS );
    var results = regex.exec( url );
    return results == null ? null : results[1];
}
gup('q', 'hxxp://example.com/?q=abc')

8
私はこのオプションが一番好きですが、空の文字列ではなくnullまたは結果を返すことを好みます。
Jason Thrasher、2010年

1
エスケープ文字が余分にあるようです。「\\ [」は「\ [」でなければなりません。これらは通常の文字列なので、[と]をエスケープする必要はありません。
EricP 2013年

これは大文字と小文字を区別しません。大文字と小文字を区別しないように「i」をどこに追加しますか?
ゼータ

alert(gup( 'UserID'、window.location.href));
Arun Prasad ES

6
@mottieデッドリンク
17

202

これは、パラメータを1つだけ確認する簡単な方法です。

URLの例:

    http://myserver/action?myParam=2

JavaScriptの例:

    var myParam = location.search.split('myParam=')[1]

「myParam」がURLに存在する場合...変数myParamには「2」が含まれ、それ以外の場合は未定義になります。

多分あなたはデフォルト値が欲しい、その場合:

    var myParam = location.search.split('myParam=')[1] ? location.search.split('myParam=')[1] : 'myDefaultValue';

更新:これはうまくいきます:

    var url = "http://www.example.com/index.php?myParam=384&login=admin"; // or window.location.href for current url
    var captured = /myParam=([^&]+)/.exec(url)[1]; // Value is in [1] ('384' in our case)
    var result = captured ? captured : 'myDefaultValue';

また、URLがパラメータでいっぱいの場合でも正しく機能します。


36
これは、取得するパラメーターがURLの最後のパラメーターである場合にのみ機能します。これは、(1つのパラメーターしか期待していない場合でも)依存すべきではありません。例えばはhttp://myserver/action?myParam=2&anotherParam=3ないもたらすであろう"2"けど"2&anotherParam=3"
Glacials 2014年

39
(location.search.split('myParam=')[1]||'').split('&')[0]- 複数のパラメーターで使用するか、欠落している可能性があり myParamます。
ガーボルイムレ

またはlocation.search.split('myParam=').splice(1).join('').split('&')[0]
J.Steve、2015

1
あなたはより多くの精度を獲得して付加することで、パラメータの任意の順序を許可することができます[?|&]のように[?|&]myParam=([^&]+)
1.21ギガワット

1
値をデコードする必要がある場合がありますresult = decodeURIComponent(result);
1.21ギガワット2018年

126

ブラウザベンダーは、URLとURLSearchParamsを介してこれを行うネイティブな方法を実装しています。

let url = new URL('http://www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5');
let searchParams = new URLSearchParams(url.search);
console.log(searchParams.get('c'));  // outputs "m2-m3-m4-m5"

現在、Firefox、Opera、Safari、Chrome、Edgeでサポートされています。ブラウザサポートのリストについては、こちらご覧ください

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams https://developer.mozilla.org/en-US/docs/Web/API/URL/URL

https://url.spec.whatwg.org/

GoogleのエンジニアであるEric Bidelmanは、サポートされていないブラウザにはこのポリフィルを使用すること推奨しています。


MDNリンクによると、SafariはURLをサポートしていますが、URLSearchParamsはサポートしていません。
Mark Thomson

3
@Markouverポリフィルはそれを処理しませんか?ところで、サファリは現代のIE6です
Csaba Toth

なぜ私のためにnew URLSearchParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5").get('a')戻っnullてきますか?(Chromeでは安定)。bそして、cうまく動作するように見えます。
ripper234 2017

回答を更新しました。元の回答はURLSearchParamsを適切に使用していませんでした。URLSearchParamsは、URLのクエリ文字列部分でのみ機能するように設計されているためです。
cgatian 2017

1
url.searchParams代わりに使用してくださいnew URLSearchParams(url.search)
Caio Tarifa 2017年

86

私はこれを数年前に見つけました、非常に簡単です:

function getUrlVars() {
    var vars = {};
    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,    
    function(m,key,value) {
      vars[key] = value;
    });
    return vars;
  }

次に、次のように呼び出します。

var fType = getUrlVars()["type"];

7
+1の優れたソリューション-エレガントで効率的でインテリジェントな使用法。私の目的では、他の受け入れられているソリューションよりも優れています
Elemental

ショート+シンプル+パワフル=グレート
mzy

1
とてもいいです。window.location.hrefの代わりにlocation.searchを使用しても機能します
Fabio C.

1
@pdxbmwこれは役に立たないため、削除する必要があります。一見するとコードは賢く見えるかもしれませんが、あまりよく考えられていません。改善点:decodeURIComponent()値を使用します。これは、通常、使用したいものだからです。URL全体ではなく、パラメータのみに関心があるため、のwindow.location.search代わりに使用window.location.hrefしてください。
Leif

2
@Leifの提案はうまくいきました。ボタンのクリックで生成されたURLの末尾に#があったため、ID 142#を取得していました。このような機能を残すvar vars = {}; window.location.search.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; }); return vars;
アンドレス・ラモス

77

でクエリ文字列を取得し、location.search疑問符の後のすべてを分割できます。

var params = {};

if (location.search) {
    var parts = location.search.substring(1).split('&');

    for (var i = 0; i < parts.length; i++) {
        var nv = parts[i].split('=');
        if (!nv[0]) continue;
        params[nv[0]] = nv[1] || true;
    }
}

// Now you can get the parameters you want like so:
var abc = params.abc;

3
パラメータの名前と値をURLデコードするのはどうですか?
Ates Goral

このアプローチは配列を処理しません。たとえば、は?array[]=1&array[]=2生成されますが{"array[]": "2"}、これは明らかに間違っています。
Kafoso

@Kafosoここには明確な正誤はありません。まず、同じ名前の繰り返しフィールドには標準の動作が指定されておらず、処理するパーサー次第です。さらに、[]パターンは一部のケース(PHPなど)でのみ意味を持ち、他のケースでは意味を持ちません。したがって、「明らかに間違っている」わけではありません。処理する必要があるかどうかに関係なく、非標準のケースを処理するために実装されていないだけです。
Blixt 2017年

38

よりシンプルでエレガントなソリューションを作成しました。

var arr = document.URL.match(/room=([0-9]+)/)
var room = arr[1];

それを見てください、2行は、それが缶に書かれていることを正確に実行します-そして、誰かが脆弱性を調査しようとしても、これらのソリューションのいくつかとは異なり、余分な文字とクエリの束を追加しても壊れません。乾杯!
David G

これは正しく、2行で実行されます。正解です。
Andres Ramos

nullのチェックが含まれている他の人にとっては便利だと思います。そうでない場合、例はここにあります:stackoverflow.com/a/36076822/1945948(編集を拒否しました)。
atw

わかりません...これは、特定の文字列「www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5」からパラメータを取得することに関する質問にどのように答えますか?
マイクげっ歯類

この回答を気に入って、+ 1しました。、あなたは置き換えることができますだけの提案[0-9] のために\d
gmanjon

31

URLSearchParamsを使用した超簡単な方法。

function getParam(param){
  return new URLSearchParams(window.location.search).get(param);
}

現在、Chrome、Firefox、Safari、Edgeなどでサポートされてます。


Edgeで実行すると、「SCRIPT5009:「URLSearchParams」が定義されていません」というエラーが表示されます。
Andreas Presthammer 2018

@AndreasPresthammerエッジのバージョンは何ですか?
spencer.sm 2018

@ spencer-sm Microsoft Edge 41.16299.820.0
Andreas Presthammer

prettified URLパラメータでは動作しません
ii iml0sto1 '26

@ iiiml0sto1「偽装されたURLパラメータ」とは何ですか?
spencer.sm

30

これは、正規表現がなく、最小限の変更を含む再帰的なソリューションです(変更されるのはparamsオブジェクトのみで、これはJSでは避けられないと思います)。

それは素晴らしいです:

  • 再帰的です
  • 同じ名前の複数のパラメータを処理します
  • 不正な形式のパラメータ文字列(欠損値など)をうまく処理します
  • 「=」が値に含まれていても壊れません
  • URLデコードを実行します
  • そして最後に、それは... arghだから素晴らしいです!

コード:

var get_params = function(search_string) {

  var parse = function(params, pairs) {
    var pair = pairs[0];
    var parts = pair.split('=');
    var key = decodeURIComponent(parts[0]);
    var value = decodeURIComponent(parts.slice(1).join('='));

    // Handle multiple parameters of the same name
    if (typeof params[key] === "undefined") {
      params[key] = value;
    } else {
      params[key] = [].concat(params[key], value);
    }

    return pairs.length == 1 ? params : parse(params, pairs.slice(1))
  }

  // Get rid of leading ?
  return search_string.length == 0 ? {} : parse({}, search_string.substr(1).split('&'));
}

var params = get_params(location.search);

// Finally, to get the param you want
params['c'];

31
あなた...あなたは2回再帰的に言った
反逆の怒り2014

次のURLで最初のパラメータが見つかりません:www.mysite.com?first
Mario Radomanana '26

こんにちはマリオ、ここにそのURLでの動作を示すJSFiddleがあります:jsfiddle.net/q6xfJ-エラーを見つけた場合、これはおそらくブラウザ固有ですか?テストするとき、私が提供した答えはlocation.searchを使用することに注意してください。これは、URLの「?first = 1&second = 2」の部分です。乾杯:)
Jai

45
それが再帰的だからといって、なぜ良いのかわかりません。
Adam Arold、2015

6
ええと、あなたはアダムの再帰冗談を逃したと思います。edi9999が2番目の「Is recursive」を削除したため、今では誰もがそれを逃します。
2015年

27

これを行う関数を作成しました:

var getUrlParams = function (url) {
  var params = {};
  (url + '?').split('?')[1].split('&').forEach(function (pair) {
    pair = (pair + '=').split('=').map(decodeURIComponent);
    if (pair[0].length) {
      params[pair[0]] = pair[1];
    }
  });
  return params;
};

2017年5月26日更新、ここにES7実装があります(babelプリセットステージ0、1、2、または3で実行):

const getUrlParams = url => `${url}?`.split('?')[1]
  .split('&').reduce((params, pair) =>
    ((key, val) => key ? {...params, [key]: val} : params)
    (...`${pair}=`.split('=').map(decodeURIComponent)), {});

いくつかのテスト:

console.log(getUrlParams('https://google.com/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('/foo?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('?a=1&b=2&c')); // Will log {a: '1', b: '2', c: ''}
console.log(getUrlParams('https://google.com/')); // Will log {}
console.log(getUrlParams('a=1&b=2&c')); // Will log {}

2018年3月26日更新、Typescriptの実装は次のとおりです。

const getUrlParams = (search: string) => `${search}?`
  .split('?')[1]
  .split('&')
  .reduce(
    (params: object, pair: string) => {
      const [key, value] = `${pair}=`
        .split('=')
        .map(decodeURIComponent)

      return key.length > 0 ? { ...params, [key]: value } : params
    },
    {}
  )

2019年2月13日更新、TypeScript 3で動作する更新されたTypeScript実装です。

interface IParams { [key: string]: string }

const paramReducer = (params: IParams, pair: string): IParams => {
  const [key, value] = `${pair}=`.split('=').map(decodeURIComponent)

  return key.length > 0 ? { ...params, [key]: value } : params
}

const getUrlParams = (search: string): IParams =>
  `${search}?`.split('?')[1].split('&').reduce<IParams>(paramReducer, {})

クエリパラメータのないURLでは、これが返されますObject {"": ""}
Ilya Semenov

2
私には十分にきれいに見えます。残りの答えは、説明が不十分な「マジック」です。
Levi Roberts、

これは素晴らしい答えです!
Spencer Bigum

ありがとう@SpencerBigum!
Nate Ferrero、

24

これを見て

function getURLParameters(paramName)
{
    var sURL = window.document.URL.toString();
    if (sURL.indexOf("?") > 0)
    {
        var arrParams = sURL.split("?");
        var arrURLParams = arrParams[1].split("&");
        var arrParamNames = new Array(arrURLParams.length);
        var arrParamValues = new Array(arrURLParams.length);

        var i = 0;
        for (i = 0; i<arrURLParams.length; i++)
        {
            var sParam =  arrURLParams[i].split("=");
            arrParamNames[i] = sParam[0];
            if (sParam[1] != "")
                arrParamValues[i] = unescape(sParam[1]);
            else
                arrParamValues[i] = "No Value";
        }

        for (i=0; i<arrURLParams.length; i++)
        {
            if (arrParamNames[i] == paramName)
            {
                //alert("Parameter:" + arrParamValues[i]);
                return arrParamValues[i];
            }
        }
        return "No Parameters Found";
    }
}

1
ありがとう。私はjscriptを初めて使用するので、これはかなり役に立ちます。
ブライアンB.

20

ECMAScript 6ソリューション:

var params = window.location.search
  .substring(1)
  .split("&")
  .map(v => v.split("="))
  .reduce((map, [key, value]) => map.set(key, decodeURIComponent(value)), new Map())

いいね。参考までに、それはマップなので、使用法はparams.get( "key");です。
evanmcd

私はそれが好きですが、おそらく最初のパラメーターを取得しません。私はあなたの例に基づいて関数を作成しました function urlParams(url) { const [, searchParams = ''] = url.split('?') return searchParams.split('&') .map(v => v.split('=')) .reduce((map, [key = '', value]) => key.length ? map.set(key, decodeURIComponent(value)) : map, new Map()) }
mah.cr

11

私が使う

function getVal(str) {
    var v = window.location.search.match(new RegExp('(?:[\?\&]'+str+'=)([^&]+)'));
    return v ? v[1] : null;
}

説明を追加してください。あなたの回答は現在「低品質」のフラグが付けられており、最終的には削除されない可能性があります。
ヨハネスジャンダー

私は、URLの末尾に「#ID」のような文字列が存在している場合ことがわかった、と「someValueの#IDは」のような最後のパラメータの値を返す
綾乃

@綾乃window.location.searchはのようなハッシュを含みません#id
Fancyoung 2016

はい@Fancyoung、あなたは右、私が使用間違い作られていますlocation.hrefのではなく、結果を一致させるためにlocation.search.Thankあなたに。
綾乃

11

parseUriライブラリを使用してます。それはあなたがあなたが求めていることを正確に行うことを可能にします:

var uri = 'www.test.com/t.html&a=1&b=3&c=m2-m3-m4-m5';
var c = uri.queryKey['c'];
// c = 'm2-m3-m4-m5'

9

これが私の解決策です。Andy Eがこの質問に答えているときにアドバイスしたように、さまざまな正規表現文字列を繰り返し作成したり、ループを実行したりして単一の値を取得するだけの場合、スクリプトのパフォーマンスは良くありません。そこで、単一のオブジェクトですべてのGETパラメーターを返す、より簡単なスクリプトを考え出しました。これを1回だけ呼び出して結果を変数に割り当て、将来の任意の時点で、適切なキーを使用してその変数から必要な値を取得する必要があります。URIデコード(つまり、%20など)も処理し、+をスペースに置き換えます。

 function getUrlQueryParams(url) {
  var queryString = url.split("?")[1];
  var keyValuePairs = queryString.split("&");
  var keyValue = [];
  var queryParams = {};
  keyValuePairs.forEach(function(pair) {
    keyValue = pair.split("=");
    queryParams[keyValue[0]] = decodeURIComponent(keyValue[1]).replace(/\+/g, " ");
});
  return queryParams;
}

だから、ここにあなたが見るためのスクリプトのいくつかのテストがあります:

// Query parameters with strings only, no special characters.
var currentParams = getUrlQueryParams("example.com/foo?number=zero");
alert(currentParams["number"]); // Gives "zero".

// For the URL you stated above...
var someParams = getUrlQueryParams("www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5 ");
alert(someParams["c"]); // Gives "m2-m3-m4-m5".

// For a query params with URI encoding...
var someParams = getUrlQueryParams("www.example.com/t.html?phrase=a%20long%20shot&location=Silicon+Valley%2C+USA");
alert(someParams["phrase"]); // Gives "a long shot".
alert(someParams["location"]); // Gives "Silicon Valley, USA".

.replace( "+"、 "")は最初の出現のみを置き換えます。.replace(/ \ + / g、 "");を使用する必要があります。
Tony

8

または、URI解析ホイールを作り直したくない場合は、URI.jsを使用します

fooという名前のパラメータの値を取得するには:

new URI((''+document.location)).search(true).foo

それは何ですか

  1. document.locationを文字列に変換します(オブジェクトです)
  2. その文字列をURI.jsのURIクラスコンストラクターにフィードする
  3. search()関数を呼び出して、URLの検索(クエリ)部分を取得します(
    trueを渡すと、オブジェクトを出力します)
  4. 結果のオブジェクトのfooプロパティにアクセスして値を取得します

これのフィドルです... http://jsfiddle.net/m6tett01/12/


8

以下のための単一のパラメータ値このindex.htmlのような?コードを以下のMSG = 1回の使用、

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search.substring(1);
    var varArray = queryString.split("="); //eg. index.html?msg=1

    var param1 = varArray[0];
    var param2 = varArray[1];

}

すべてのパラメーター値については、次のコードを使用します。

$(window).load(function(){
    queryString();
});

function queryString()
{
    var queryString = window.location.search;
    var varArray = queryString.split("&");
    for (var i=0;i<varArray.length;i++) {
      var param = varArray[i].split("=");
        //parameter-value pair
    }
} 

1
私はこの解決策が好きです!
alemur 2015年

8

ここに一例を掲載します。しかし、それはjQueryにあります。それが他の人を助けることを願っています:

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.url.js"></script>

<!-- URL:  www.example.com/correct/?message=done&year=1990-->

<script type="text/javascript">
$(function(){
    $.url.attr('protocol')  // --> Protocol: "http"
    $.url.attr('path')          // --> host: "www.example.com"
    $.url.attr('query')         // --> path: "/correct/"
    $.url.attr('message')   // --> query: "done"
    $.url.attr('year')      // --> query: "1990"
});
</script>

1
他の投稿からのコピー: "urlプラグインが必要:plugins.jquery.com/url"
ゼータ

8

最短の方法:

new URL(location.href).searchParams.get("my_key");

2
後者は任意のURLの最初のクエリパラメータを取得するときに失敗するので、使用new URL(location.href).searchParams.get("my_key")することをお勧めしURLSearchParamsます。
トラビスクラーク

1
両方のバリアントをテストしました。仰るとおりです。回答を編集しました。
Zon

7

この質問の回答は多すぎるので、もう1つ追加します。

/**
 * parses and returns URI query parameters 
 * 
 * @param {string} param parm
 * @param {bool?} asArray if true, returns an array instead of a scalar 
 * @returns {Object|Array} 
 */
function getURIParameter(param, asArray) {
    return document.location.search.substring(1).split('&').reduce(function(p,c) {
        var parts = c.split('=', 2).map(function(param) { return decodeURIComponent(param); });
        if(parts.length == 0 || parts[0] != param) return (p instanceof Array) && !asArray ? null : p;
        return asArray ? p.concat(parts.concat(true)[1]) : parts.concat(true)[1];
    }, []);
}

使用法:

getURIParameter("id")  // returns the last id or null if not present
getURIParameter("id", true) // returns an array of all ids

これは、空のパラメーター(なしで存在するこれらのキー"=value")、スカラーと配列ベースの値取得APIの両方の公開、および適切なURIコンポーネントのデコードに対処します。


7

replace()メソッドを使用する最も簡単な方法:

urlStr文字列から:

paramVal = urlStr.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

または現在のURLから:

paramVal = document.URL.replace(/.*param_name=([^&]*).*|(.*)/, '$1');

説明:

  • document.URL -インターフェースはドキュメントの場所(ページのURL)を文字列として返します。
  • replace()-メソッドの一部またはすべてのマッチした新しい文字列を返すパターンに置き換え交換を
  • /.*param_name=([^&]*).*/- スラッシュで囲まれた正規表現パターン:
    • .* -0個以上の任意の文字、
    • param_name= -検索されるパラメータ名、
    • () -正規表現のグループ、
    • [^&]*-一つ以上を除く任意の文字を&
    • | -交互、
    • $1 -正規表現の最初のグループへの参照。

var urlStr = 'www.test.com/t.html?a=1&b=3&c=m2-m3-m4-m5';
var c = urlStr.replace(/.*c=([^&]*).*|(.*)/, '$1');
var notExisted = urlStr.replace(/.*not_existed=([^&]*).*|(.*)/, '$1');
console.log(`c === '${c}'`);
console.log(`notExisted === '${notExisted}'`);


1
良い解決策ですが、パラメータが見つからない場合は、文字列全体が返されます。この場合、「未定義」を期待します。
pensan

1
こんにちは、@ pensan。素晴らしいコメントをありがとう。正規表現に、パラメーターがURLに表示されない場合の処理​​を追加するだけです。この場合、文字列全体ではなく空の文字列を取得します。
simhumileco

6

さらに別の提案。

すでに良い答えはいくつかありますが、私はそれらが不必要に複雑で理解しにくいことに気づきました。これは短くて単純で、URLのトークン名に対応するキー名を持つ単純な連想配列を返します。

学びたい人のために、以下のコメント付きのバージョンを追加しました。

これはループのためにjQuery($ .each)に依存していることに注意してください。これは、forEachではなくお勧めします。古いブラウザーでサポートされていない新しい機能をサポートするために個別の修正をプラグインするよりも、jQueryを使用してブラウザー全体の互換性を確保する方が簡単だと思います。

編集:これを書いた後、Eric Elliottの回答に気づきました。ほぼ同じですが、forEachを使用していますが、(上記の理由により)一般的には反対です。

function getTokens(){
    var tokens = [];
    var query = location.search;
    query = query.slice(1);
    query = query.split('&');
    $.each(query, function(i,value){    
        var token = value.split('=');   
        var key = decodeURIComponent(token[0]);     
        var data = decodeURIComponent(token[1]);
        tokens[key] = data;
    });
    return tokens;
}

コメント付きバージョン:

function getTokens(){
    var tokens = [];            // new array to hold result
    var query = location.search; // everything from the '?' onward 
    query = query.slice(1);     // remove the first character, which will be the '?' 
    query = query.split('&');   // split via each '&', leaving us an array of something=something strings

    // iterate through each something=something string
    $.each(query, function(i,value){    

        // split the something=something string via '=', creating an array containing the token name and data
        var token = value.split('=');   

        // assign the first array element (the token name) to the 'key' variable
        var key = decodeURIComponent(token[0]);     

        // assign the second array element (the token data) to the 'data' variable
        var data = decodeURIComponent(token[1]);

        tokens[key] = data;     // add an associative key/data pair to our result array, with key names being the URI token names
    });

    return tokens;  // return the array
}

以下の例では、このアドレスを想定しています。

http://www.example.com/page.htm?id=4&name=murray

URLトークンを独自の変数に割り当てることができます。

var tokens = getTokens();

次に、各URLトークンを次のように名前で参照します。

document.write( tokens['id'] );

これは「4」を出力します。

関数からトークン名を直接参照することもできます。

document.write( getTokens()['name'] );

...「マレー」と表示されます。


6
// Read a page's GET URL variables and return them as an associative array.
function getUrlVars()
{
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)
    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }
    return vars;
}

// Usage for URL: http://my.site.com/location?locationId=53cc272c0364aefcb78756cd&shared=false
var id = getUrlVars()["locationId"];

ここから取得http : //jquery-howto.blogspot.ru/2009/09/get-url-parameters-values-with-jquery.html


6

簡単な方法

function getParams(url){
        var regex = /[?&]([^=#]+)=([^&#]*)/g,
            params = {},
            match;
        while(match = regex.exec(url)) {
            params[match[1]] = match[2];
        }
        return params;
    }

次にgetParams(url)のように呼び出します


5

URL GET変数を読み取り、urlパラメーターに基づいてアクションを完了する必要がありました。私は解決策を求めて高低を検索し、この小さなコードに出くわしました。基本的には、現在のページのURLを読み取り、URLに対して正規表現を実行してから、URLパラメーターを連想配列に保存します。

したがって、例として、JavaScriptが下部にある次のURLがあるとします。

http://TestServer/Pages/NewsArchive.aspx?year=2013&Month=July

パラメータIDとページを取得するために必要なのは、これを呼び出すことだけです。

コードは次のようになります。

<script type="text/javascript">
var first = getUrlVars()["year"];
var second = getUrlVars()["Month"];

alert(first);
alert(second);
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
</script>

おかげで私のために働いた
OJB1

5
// http:localhost:8080/path?param_1=a&param_2=b
var getParamsMap = function () {
    var params = window.location.search.split("&");
    var paramsMap = {};
    params.forEach(function (p) {
        var v = p.split("=");
        paramsMap[v[0]]=decodeURIComponent(v[1]);
    });
    return paramsMap;
};

// -----------------------

console.log(getParamsMap()["param_1"]);  // should log "a"     

これは '?'を含む最初のパラメーターを返します
Pini Cheyni 2017年

5

Eldon McGuinnessによるこの要旨は、これまでに見た中で最も完全なJavaScriptクエリ文字列パーサーの実装です。

残念ながら、それはjQueryプラグインとして書かれています。

私はそれをバニラJSに書き直して、いくつかの改良を加えました:

function parseQuery(str) {
  var qso = {};
  var qs = (str || document.location.search);
  // Check for an empty querystring
  if (qs == "") {
    return qso;
  }
  // Normalize the querystring
  qs = qs.replace(/(^\?)/, '').replace(/;/g, '&');
  while (qs.indexOf("&&") != -1) {
    qs = qs.replace(/&&/g, '&');
  }
  qs = qs.replace(/([\&]+$)/, '');
  // Break the querystring into parts
  qs = qs.split("&");
  // Build the querystring object
  for (var i = 0; i < qs.length; i++) {
    var qi = qs[i].split("=");
    qi = qi.map(function(n) {
      return decodeURIComponent(n)
    });
    if (typeof qi[1] === "undefined") {
      qi[1] = null;
    }
    if (typeof qso[qi[0]] !== "undefined") {

      // If a key already exists then make this an object
      if (typeof (qso[qi[0]]) == "string") {
        var temp = qso[qi[0]];
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]] = [];
        qso[qi[0]].push(temp);
        qso[qi[0]].push(qi[1]);

      } else if (typeof (qso[qi[0]]) == "object") {
        if (qi[1] == "") {
          qi[1] = null;
        }
        qso[qi[0]].push(qi[1]);
      }
    } else {
      // If no key exists just set it as a string
      if (qi[1] == "") {
        qi[1] = null;
      }
      qso[qi[0]] = qi[1];
    }
  }
  return qso;
}

// DEMO
console.log(parseQuery("?foo=bar&foo=boo&roo=bar;bee=bop;=ghost;=ghost2;&;checkbox%5B%5D=b1;checkbox%5B%5D=b2;dd=;http=http%3A%2F%2Fw3schools.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab&http=http%3A%2F%2Fw3schools2.com%2Fmy%20test.asp%3Fname%3Dst%C3%A5le%26car%3Dsaab"));

このフィドルも参照してください。


JavaScriptについて私が理解していないのは、なぜURL解析関数を作成して言語自体に入れなかったか、少なくとも標準ライブラリに入れなかったのですか?低レベルのものはこれを何度も再発明するべきではなく、開発者が開発するエントロピー的に変形したソリューションを利用することもできません。これがしっかりしている場合は、このようなものを標準ライブラリに作成する必要があります。これは、JavaScriptで私をその言語に引き付けるタイプの例です。
ahnbizcad

5

エレガントで機能的なスタイルのソリューション

URLパラメータ名をキーとして含むオブジェクトを作成してみましょう。そうすれば、名前でパラメータを簡単に抽出できます。

// URL: https://example.com/?test=true&orderId=9381  

// Build an object containing key-value pairs
export const queryStringParams = window.location.search
  .split('?')[1]
  .split('&')
  .map(keyValue => keyValue.split('='))
  .reduce<QueryStringParams>((params, [key, value]) => {
    params[key] = value;
    return params;
  }, {});

type QueryStringParams = {
  [key: string]: string;
};


// Return URL parameter called "orderId"
return queryStringParams.orderId;

これは大好きですが、アキュムレータをリデュース関数に戻すことを確認せずに機能しませんでした
Ella

@Ellaそれはタイプミスでした、それなしでは動作する方法はありませんreturn

これで見栄えが良くなりました。最初のページに移動してください。
Ellaは

4

これが私がすることです:

var uriParams = getSearchParameters();
alert(uriParams.c);


// background functions:

// Get object/associative array of URL parameters
function getSearchParameters () {
  var prmstr = window.location.search.substr(1);
  return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {};
}

// convert parameters from url-style string to associative array
function transformToAssocArray (prmstr) {
  var params = {},
      prmarr = prmstr.split("&");

  for (var i = 0; i < prmarr.length; i++) {
    var tmparr = prmarr[i].split("=");
    params[tmparr[0]] = tmparr[1];
  }
  return params;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.