【PHP】URLを分解して配列で取り出すには?

php

PHPでプログラムをするとやっぱURLって結構いじるときありますよね。
例えば、MVCでURLの一部分を文字列として扱ったり、余計な文字列を削除したり・・・など、URLを解析してURLのドメインやスキーマ、ポート番号、クエリパラメータなどの情報を取得したいと言う場面って結構あると思うんで自分の為にもメモ。

パラメータがついてるURL

単純なURLだったらまだしも、たいていパラメーターがたくさんついたURLだったりしません?URLの末尾(?以降)の文字列のことなんですけど、クエリ文字列っていいます。

まぁこいつを分解(以下 パース)となるともうめんどくさいですよね(笑)

//パラメーターがついたURL
$str="http://www.sample.jp:8080/test/sample.html?param1=ABC¶m2=abc";

という訳で以下の手順でちょっと分解してみようかと思います。

  • URLデコードを行う
  • URLを連想配列に分解する
  • URLの中からパラメーターの部分(?以降)を取り出す

という流れでレッツスタート!

URLを分解・分析する全体のコード

まずは、全体のコードを載せておきます。

//パースするURL
$str="http://www.sample.jp:8080/test/sample.html?param1=AAA¶m2=BBB";

//URLデコードを行う
$srt=urldecode($str);//urlエンコードされている場合に元に戻す(?が&になっている時など)

//URLを連想配列に分解する
$url=parse_url($str);


//パラメーター部分をパースします。
parse_str($url['query'], $parms); //$parmsの連想配列へ

URLデコードを行う

URLはよく「%E3%81%9D%E3%81%B5%E3%81%83%E3%81」みたいにエンコードされてることがあるので、そいつを一旦、urldecode()でデコードして戻す。

URLを連想配列に分解する

さて、ここでparse_url()を使います。

parse_urlは第1引数に指定されたURLを解析してその結果を連想配列で返してくれる関数です。

その、連想配列の中身は下記のようになっています。

array(5) {
  ["scheme"]=> string(4) "http"
  ["host"]=>   string(11) "www.sample.jp"
  ["port"]=>   int(8080)
  ["path"]=>   string(23) "/test/sample.html"
  ["query"]=>  string(21) "param1=AAA¶m2=BBB"
 
}

URLの中からパラメーターの部分(?以降)を取り出す

連想配列に分解した後、パラメーターは$url[‘query’]の中に入っていますが、「param1=AAA&param2=BBB」のままなので、まだ分解しきれていません。

もし、パラメーターの個々の値が必要な時はさらに分解する必要があるので、そんな時は parse_str() を使う事によってパースできます。

parse_strは、指定したクエリ文字列(パラメーターの部分)をパース(分解)し、変数に格納する関数です。

第1引数にparse_urlで分解した$url[‘query’]を指定する。第2引数に分解したパラメーターを連想配列で保存するための変数を指定します。そうすると下記のように連想配列として分解されています。

//パラメーター部分をパースします。
parse_str($url['query'], $parms); //$parmsの連想配列へ

//出力
printf($parms['param1']);    //中身は 「AAA」
printf($parms['param2']);    //中身は 「BBB」 

下記参考サイト

ということで以上でおしまいなんですが、一応サンプルを作りました。「【PHP】URLを分解して配列で取り出すには?