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

# parse_url

(PHP 4, PHP 5, PHP 7, PHP 8)

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

### 説明

function parse_url(string `$url`, int `$component` = -1): int|string|array|null|false

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

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

警告

この関数は、確立された URI や URL の標準仕様に準拠していません。 相対 URL や不正な形式の URL に対しては、 誤った結果や意味をなさない結果を返します。 有効な URL であっても、異なる URL パーサーの結果と一致しないことがあります。 これは、異なるユースケースを対象とし、要件が異なる URL 関連の標準仕様が複数存在するためです。

異なる URL 標準に従うパーサーで URL を処理することは、 セキュリティ上の脆弱性の一般的な原因です。 たとえば、パーサー A で URL のホスト名を許可リストに照らして検証しても、 リソースの実際の取得にホスト名の抽出方法が異なるパーサー B が使われる場合、 その検証は無効になる可能性があります。

Uri\Rfc3986\Uri クラスと Uri\WhatWg\Url クラスは、それぞれ RFC 3986 と WHATWG URL Standard に厳密に従います。 新しく書くすべてのコードでこれらのクラスを使用し、 parse_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` を省略した場合は、連想配列を返します。 連想配列の中には少なくともひとつの要素が含まれます。 この配列に含まれる可能性のある要素は次のとおりです。

- 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"
    }

### 注意

> 注意:

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

### 参考

- pathinfo() - ファイルパスに関する情報を返す
- parse_str() - URL のクエリストリングとして文字列をパースする
- http_build_query() - URL エンコードされたクエリ文字列を生成する
- dirname() - 親ディレクトリのパスを返す
- basename() - パスの最後にある名前の部分を返す
- » RFC 3986

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open