parse_url

URL を解釈し、その構成要素を返す

説明

intstringarraynullfalse parse_url(string $url, int $component = -1)

この関数は、URL の様々な構成要素のうち特定できるものに関して 連想配列にして返します。 連想配列に含まれる要素の値は、URLデコード されません

この関数は、指定された URL が有効かどうかを調べるためのもの ではなく、単に URL を以下で示す 要素に分解するだけのものです。不完全、かつ不正な URL であっても受け入れますし、 そのような場合でも parse_url は可能な限り 正しく解析しようとします。

パラメータ

url

パースする URL。

component

PHP_URL_SCHEMEPHP_URL_HOSTPHP_URL_PORTPHP_URL_USERPHP_URL_PASSPHP_URL_PATHPHP_URL_QUERY あるいは PHP_URL_FRAGMENT のうちのいずれかを指定し、 特定の URL コンポーネントのみを文字列 (PHP_URL_PORT を指定した場合だけは整数値) で取得するようにします。

戻り値

完全におかしな形式の URL については、parse_urlfalse を返します。

component を省略した場合は、連想配列を返します。 連想配列の中には少なくともひとつの要素が含まれます。 この配列に含まれる可能性のある要素は次のとおりです。

  • scheme - 例: http
  • host
  • port
  • user
  • pass
  • path
  • query - クエスチョンマーク ? 以降
  • fragment - ハッシュマーク # 以降

component が指定されている場合、 parse_url は配列ではなく文字列 (PHP_URL_PORT の場合は整数値) を返します。 要求したコンポーネントが指定した URL の中にない場合は null を返します。 PHP 8.0.0 以降では、 parse_url は、query と fragment について、 存在しないことと値が空であることを以下のように区別します:

http://example.com/foo → query = null, fragment = null
http://example.com/foo? → query = "",   fragment = null
http://example.com/foo# → query = null, fragment = ""
http://example.com/foo?# → query = "",   fragment = ""

8.0.0 より前のバージョンでは、上記の場合は query も fragment も共に null になっていました。

URL の各要素(コンポーネント) に含まれる制御文字 (ctype_cntrl も参照ください) は、 アンダースコア (_) に置き換えられる点に注意して下さい。

変更履歴

バージョン 説明
8.0.0 parse_url は、query と fragment について、 存在しないことと値が空であることを区別するようになりました。

例1 parse_url の例

<?php
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';

var_dump(parse_url($url));
var_dump(parse_url($url, PHP_URL_SCHEME));
var_dump(parse_url($url, PHP_URL_USER));
var_dump(parse_url($url, PHP_URL_PASS));
var_dump(parse_url($url, PHP_URL_HOST));
var_dump(parse_url($url, PHP_URL_PORT));
var_dump(parse_url($url, PHP_URL_PATH));
var_dump(parse_url($url, PHP_URL_QUERY));
var_dump(parse_url($url, PHP_URL_FRAGMENT));
?>

上の例の出力は以下となります。

array(8) {
  ["scheme"]=>
  string(4) "http"
  ["host"]=>
  string(8) "hostname"
  ["port"]=>
  int(9090)
  ["user"]=>
  string(8) "username"
  ["pass"]=>
  string(8) "password"
  ["path"]=>
  string(5) "/path"
  ["query"]=>
  string(9) "arg=value"
  ["fragment"]=>
  string(6) "anchor"
}
string(4) "http"
string(8) "username"
string(8) "password"
string(8) "hostname"
int(9090)
string(5) "/path"
string(9) "arg=value"
string(6) "anchor"

例2 parse_url でスキームを省略した例

<?php
$url = '//www.example.com/path?googleguy=googley';

// 5.4.7 より前のバージョンでは、パスを "//www.example.com/path" のように表示していました
var_dump(parse_url($url));
?>

上の例の出力は以下となります。

array(3) {
  ["host"]=>
  string(15) "www.example.com"
  ["path"]=>
  string(5) "/path"
  ["query"]=>
  string(17) "googleguy=googley"
}

注意

警告

この関数は相対 URL、 または不正な URL に対しては正しい結果を返さないかもしれません。 また、この関数の返す結果は、 HTTP クライアントの一般的な挙動とも異なるかもしれません。 信頼できない入力から得られる URL をパースする必要がある場合、 たとえば filter_var 関数を FILTER_VALIDATE_URL と一緒に使うなどして、 追加の検証を行うことが必須です。

注意:

parse_url は URL をパースするための関数であり、 URI をパースするものではありません。しかし、PHP の後方互換性を満たすため、 例外として file:// スキームについては 3 重スラッシュ(file:///...) が認められています。他のスキームにおいては、これは無効な形式となります。

参考

  • pathinfo
  • parse_str
  • http_build_query
  • dirname
  • basename
  • » RFC 3986