解析 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() 会尝试尽量正确解析。

警告

此函数可能无法对相对和无效 URL 提供正确的结果，结果甚至可能会跟常见的 HTTP 客户端行为不匹配。如果需要解析来自不受信任输入的 URL，则需要另外验证，例如，使用带 `FILTER_VALIDATE_URL` 过滤器的 filter_var()。

### 参数

`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 中指定的部分的 string。（当指定为 `PHP_URL_PORT` 时，返回值将是 int）。

### 返回值

对严重不合格的 URL，parse_url() 可能会返回 `false`。

如果省略了 `component` 参数，将返回关联数组 array。至少会有一个元素出现在数组中。数组中可能的键有以下几种：

- scheme——如 `http`
- host
- port
- user
- pass
- path
- query——在问号 `?` 之后
- fragment——在注释符号 `#` 之后

如果指定 `component` 参数，parse_url() 返回 string （或在指定为 `PHP_URL_PORT` 时返回 int）而不是 array。如果 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 = ""

之前所有的情况都会导致 query 和 fragment 为 `null`。

注意组件中的控制字符（参见 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://` 协议允许三个斜线（`file:///...`）。其它任何协议都不能这样。

### 参见

- pathinfo() - 返回文件路径的信息
- parse_str() - 解析 URL 查询字符串
- http_build_query() - 生成 URL-encode 之后的请求字符串
- dirname() - 返回路径中的目录部分
- basename() - 返回路径中的文件名部分
- » RFC 3986

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