php parse_url函数解析url

更新版本:(PHP 4, PHP 5, PHP 7, PHP 8)

解析一个 URL并返回各个组成部分。语法:

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

此函数解析 URL 并返回一个关联数组,其中包含存在的 URL 的任何各种组件。数组元素的值未经过 URL 解码。

这个函数并不意味着验证给定的 URL,它只是将它分解成下面列出的部分。部分和无效的 URL 也被接受, parse_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,在这种情况下,返回值将是一个 int)。

返回值说明:

在严重格式错误的 URL 上,parse_url() 可能返回 false。

如果省略 component 参数,则返回关联数组。至少一个元素将出现在数组中。此数组中的潜在键是:

  • scheme – e.g. http
  • host
  • port
  • user
  • pass
  • path
  • query – after the question mark ?
  • fragment – after the hashmark #
  • 如果指定了 component 参数,则 parse_url() 返回一个字符串(或一个 int,在 PHP_URL_PORT 的情况下)而不是一个数组。如果请求的组件在给定的 URL 中不存在,将返回 null。从 PHP 8.0.0 开始, parse_url() 区分不存在和空的查询和片段:
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 = ""

前面所有情况都导致查询和片段为空。

请注意,组件中的控制字符(参见 ctype_cntrl())被替换为下划线 (_)。

例如以下代码:

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

从数组转换为URL字符串的方法,例子:

<?php

$url = 'http://usr:pss@example.com:81/mypath/myfile.html?a=b&b[]=2&b[]=3#myfragment';
if ($url === unparse_url(parse_url($url))) {
  print "YES, they match!\n";
}

function unparse_url($parsed_url) {
  $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
  $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
  $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
  $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
  $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
  $pass     = ($user || $pass) ? "$pass@" : '';
  $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
  $query    = isset($parsed_url['query']) ? '?' . $parsed_url['query'] : '';
  $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
  return "$scheme$user$pass$host$port$path$query$fragment";
}

?>

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注