將 URL 分解為關聯陣列,支援完整 URL 或相對路徑。
<?php
$url = "https://user:pass@example.com:8080/path/to/page?name=value&foo=bar#section";
$parts = parse_url($url);
print_r($parts);
/* 輸出:
Array
(
[scheme] => https
[host] => example.com
[port] => 8080
[user] => user
[pass] => pass
[path] => /path/to/page
[query] => name=value&foo=bar
[fragment] => section
)
*/
$url = "https://example.com/path?query=1#frag"; echo parse_url($url, PHP_URL_SCHEME); // https echo parse_url($url, PHP_URL_HOST); // example.com echo parse_url($url, PHP_URL_PORT); // null(無指定港口) echo parse_url($url, PHP_URL_PATH); // /path echo parse_url($url, PHP_URL_QUERY); // query=1 echo parse_url($url, PHP_URL_FRAGMENT); // frag
可用常數:`PHP_URL_SCHEME`、`PHP_URL_HOST`、`PHP_URL_PORT`、`PHP_URL_USER`、`PHP_URL_PASS`、`PHP_URL_PATH`、`PHP_URL_QUERY`、`PHP_URL_FRAGMENT`
<?php
$query = "name=John&age=30&tags[]=php&tags[]=js&tags[]=vue";
// 解析到陣列(推薦,不污染符號表)
$params = array();
parse_str($query, $params);
print_r($params);
/*
Array
(
[name] => John
[age] => 30
[tags] => Array ( [0] => php, [1] => js, [2] => vue )
)
*/
// 解析到當前符號表(不推薦,安全風險)
// parse_str($query); // 產生 $name, $age, $tags
function get_url_params($url) {
$parts = parse_url($url);
$params = array();
if (isset($parts['query'])) {
parse_str($parts['query'], $params);
}
return $params;
}
$url = "https://api.example.com/search?q=php&page=2&sort=desc&tags[]=web&tags[]=backend";
$params = get_url_params($url);
// $params = ['q'=>'php', 'page'=>'2', 'sort'=>'desc', 'tags'=>['web','backend']]
$params = array(
'q' => 'php tutorial',
'page' => 2,
'tags' => array('web', 'backend'),
'filter' => array('type' => 'article', 'lang' => 'zh')
);
$query = http_build_query($params);
// q=php+tutorial&page=2&tags%5B0%5D=web&tags%5B1%5D=backend&filter%5Btype%5D=article&filter%5Blang%5D=zh
$url = "https://api.example.com/search?" . $query;
原文提供的正則解析函數,現代專案建議改用 `parse_url()` + `parse_str()`,但可作為理解 URL 結構參考:
function parseurl_regex($url) {
$regex = "~^" .
"(?:(?P\w+)://)?" . // scheme
"(?:(?P\w+):(?P\w+)@)?" . // user:pass@
"(?P(?:(?P[-\w.]+)\.)?" . // subdomain.
"(?P[-\w]+\.(?P\w+)))" . // domain.tld
"(?::(?P\d+))?" . // :port
"(?P[\w/]*/(?P\w+(?:\.\w+?)?)?)?" .// /path/file.ext
"(?:\?(?P[\w=&]+))?" . // ?query
"(?:#(?P\w+))?" . // #anchor
"$~";
preg_match($regex, $url, $matches);
return $matches;
}
$url = "/path/page?query=1"; $parts = parse_url($url); // 只有 [path] 和 [query],無 scheme/host
$url = "https://example.com/page"; $parts = parse_url($url); // 無 [query] 鍵,需用 isset() 檢查
$url = "https://example.com/search?q=php+教學&lang=zh-TW"; $params = get_url_params($url); // $params['q'] = 'php 教學'(自動解碼 + 為空格)