$url = 'https://user:pass@example.com:8080/path?query=value#fragment';
$parts = parse_url($url);
print_r($parts);
/* 輸出
Array (
[scheme] => http
[host] => example.com
[port] => 8080
[user] => user
[pass] => pass
[path] => /path
[query] => query=value
[fragment] => fragment
) */
echo parse_url($url, PHP_URL_HOST); // example.com
echo parse_url($url, PHP_URL_PATH); // /path
echo parse_url($url, PHP_URL_QUERY); // query=value
// 可用常數:PHP_URL_SCHEME, HOST, PORT, USER, PASS, PATH, QUERY, FRAGMENT
parse_url($url, PHP_URL_HOST) 直接取得,無需正則。parse_str($parts['query'], $arr) 獲取陣列。host 是否在白名單,防 SSRF/開放重導向。//example.com/path)會缺 scheme,host 仍可解析。path/to/file)無法解析,需先補全基礎 URL。
3. 含非 ASCII 域名(IDN)需先 idn_to_ascii() 轉 Punycode 再解析。
4. PHP 8.1+ 棄用 parse_url() 部分行為,建議改用 parse_url() + UrlParser (symfony/polyfill) 或 League\Uri。
$query = 'a=1&b=2&c[]=3&c[]=4';
parse_str($query, $arr);
// $arr = ['a'=>'1','b'=>'2','c'=>['3','4']]
parse_url() + parse_str() 是 PHP 處理 URL 的黃金組合,輕量、無依賴、標準庫即得。