(PHP 4, PHP 5, PHP 7, PHP 8)
parse_url — URL を解釈し、その構成要素を返す
$url
, int $component
= -1): int|string|array|null|falseこの関数は、URL の様々な構成要素のうち特定できるものに関して 連想配列にして返します。 連想配列に含まれる要素の値は、URLデコード されません。
この関数は、指定された URL が有効かどうかを調べるためのもの ではなく、単に URL を以下で示す 要素に分解するだけのものです。不完全、かつ不正な URL であっても受け入れますし、 そのような場合でも parse_url() は可能な限り 正しく解析しようとします。
url
パースする URL。
component
PHP_URL_SCHEME
、
PHP_URL_HOST
、PHP_URL_PORT
、
PHP_URL_USER
、PHP_URL_PASS
、
PHP_URL_PATH
、PHP_URL_QUERY
あるいは PHP_URL_FRAGMENT
のうちのいずれかを指定し、
特定の URL コンポーネントのみを文字列
(PHP_URL_PORT
を指定した場合だけは整数値)
で取得するようにします。
完全におかしな形式の URL については、parse_url() は
false
を返します。
component
を省略した場合は、連想配列を返します。
連想配列の中には少なくともひとつの要素が含まれます。
この配列に含まれる可能性のある要素は次のとおりです。
?
以降
#
以降
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.1.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:///...) が認められています。他のスキームにおいては、これは無効な形式となります。