例えばこういうURLがある時...
1 |
https://example.com/?hoge=123&fuga=234#hash |
この ?hoge=123 などがクエリパラメータ
これをPHPで配列として取得したかったです。
その方法について考えてみたので、
PHPでクエリパラメータ取得のやり方をまとめ
このページの目次
前提.現在URLは REQUEST_URI から取得できる
まず大前提の知識として。
現在ページのURLには次の変数を参照します。
▼ $_SERVER['REQUEST_URI'] について
'REQUEST_URI'
ページにアクセスするために指定された URI。例えば、 '/index.html'
引用元 : https://www.php.net/manual/ja/reserved.variables.server.php
これはパスだけではなくクエリパラメーター(例 : ?hoge=123&fuga=456)・ハッシュ(例 : #xxx)なども含めて全て取得できます。
現在のスクリプト内でクエリ文字列解析するにはURLが分かってないといけません。あまり使う機会は多いないけど、前提知識として紹介しておきます。
方法1.正規表現で愚直にパラメーター取得
まずは正規表現を使ったやり方
クエリパラメーターは正規表現的にはこう表せます。
1 |
[\?&]([^&]+)=([^&#]+) |
1つのクエリパラメーターは ? または & から始まるので [\?&] 、そしてキーは ([^&]+) 、その値は ([^&#]+) となります。あとハッシュを含ませないように対策もしました。
そして実際にクエリ取得のコードを書いてみます。
▼ 配列取得のコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/// URL : 本来は REQUEST_URI などから取得 $url = "/index.html?hoge=123&fuga=456#hash"; $pattern = "/[\?&]([^&]+)=([^&#]+)/"; preg_match_all($pattern, $url, $matches); $queries = []; $size = count($matches[0]); for($i = 0; $i < $size; $i++){ $key = $matches[1][$i]; $value = $matches[2][$i]; $queries[$key] = $value; } var_export($queries); |
▼ このコードの出力結果
1 2 3 4 |
array ( 'hoge' => '123', 'fuga' => '456', ) |
少しクエリパラメータの取り出し方が大変ですが、正規表現にマッチするものを連続的に探していけば確実に配取得できます。これが正規表現を使った方法
方法2.parse_url() + parse_str() でパラメーター取得
正規表現を使うのはベストではないです。
実はもっといい方法があったので。
それは次の2つの関数を使うこと
▼ 公式での parse_url() の説明
parse_url ( string $url , int $component = -1 ) : mixed
この関数は、URL の様々な構成要素のうち特定できるものに関して 連想配列にして返します。 連想配列に含まれる要素の値は、URLデコード されません。
この関数は、指定された URL が有効かどうかを調べるためのもの ではなく、単に URL を上で示した 要素に分解するだけのものです。不完全な URL であっても受け入れられますし、 そのような場合でも parse_url() は可能な限り 正しく解析しようとします。
▼ 公式での parse_str() の説明
parse_str ( string $string , array &$result ) : void
URL 経由で渡されるクエリ文字列と同様に string を処理し、現在のスコープに変数をセットします。 (result が指定された場合は、配列 result にセットします)
こんな便利なのがあるとは今まで知りませんでした。まず parse_url() でクエリ文字列部分を取得し、そのあと parse_str() で配列としてクエリパラメーターが得られます。
説明だと分かりにくいのでコードで示します。
▼ このようなコードを書いてみた
1 2 3 4 5 6 |
/// URL : 本来は REQUEST_URI などから取得 $url = "/index.html?hoge=123&fuga=456#hash"; $query_str = parse_url($url)['query']; parse_str($query_str, $queries); var_export($queries); |
▼ このコードの出力結果
1 2 3 4 |
array ( 'hoge' => '123', 'fuga' => '456', ) |
上コードでは parse_url($url)['query'] で解析されたクエリ文字列部分を取得、そのあと parse_str($query_str, $queries) でクエリを配列として解析して $queries に格納してます。
ポイントは2つを組み合わせることですね。
クエリパラメータ取得の方法まとめ
ということで次の2つが使えます。
確実なのは2つ目の方法を使うことですね。
わざわざ正規表現を使う場面はあんまりないかも。
以上、PHPでクエリパラメータ取得でした。ではまた