PHP 提供兩大核心函數解析 URL:parse_url() 拆解 URL 結構,parse_str() 解析查詢字串為變數。兩者結合可輕鬆處理複雜的 URL 與資料傳遞場景。
mixed parse_url ( string $url [, int $component = -1 ] )
省略 $component 時回傳關聯陣列,可能包含鍵值:
scheme:協議(如 http)host:主機名port:連接埠user、pass:認證資訊path:路徑query:查詢字串(? 之後)fragment:錨點(# 之後)指定 $component 時回傳對應字串(PHP_URL_PORT 回傳整數),該部分不存在則回傳 NULL。
<?php
$url = 'https://username:password@hostname/path?arg=value#anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH);
輸出結果:
Array
(
[scheme] => http
[host] => hostname
[user] => username
[pass] => password
[path] => /path
[query] => arg=value
[fragment] => anchor
)
/path
void parse_str ( string $str [, array &$arr ] )
$arr:將變數直接註冊到當前作用域(不推薦,易造成變數汙染)$arr:將解析結果存入陣列,安全且可控<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first; // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
parse_str($str, $output);
echo $output['first']; // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz
?>
Redis 連線格式:redis://user:pass@host:port/db?option1=val1&option2=val2
<?php
public static function parseDsn($dsn) {
if ($dsn == '') {
$dsn = 'redis://' . self::DEFAULT_HOST;
}
$parts = parse_url($dsn);
// 驗證協議
$validSchemes = array('redis', 'tcp');
if (isset($parts['scheme']) && !in_array($parts['scheme'], $validSchemes)) {
throw new \InvalidArgumentException("Invalid DSN. Supported schemes: " . implode(', ', $validSchemes));
}
// 處理無 scheme 格式(如單純 hostname)
if (!isset($parts['host']) && isset($parts['path'])) {
$parts['host'] = $parts['path'];
unset($parts['path']);
}
// 解析連接埠
$port = isset($parts['port']) ? intval($parts['port']) : self::DEFAULT_PORT;
// 從 path 取得資料庫編號
$database = false;
if (isset($parts['path'])) {
$database = intval(preg_replace('/[^0-9]/', '', $parts['path']));
}
// 解析認證資訊
$user = isset($parts['user']) ? $parts['user'] : false;
$pass = isset($parts['pass']) ? $parts['pass'] : false;
// 解析查詢參數
$options = array();
if (isset($parts['query'])) {
parse_str($parts['query'], $options);
}
return array($parts['host'], $port, $database, $user, $pass, $options);
}
?>
| 函數 | 用途 | 回傳型別 | 適用場景 |
|---|---|---|---|
| parse_url | 拆解 URL 結構 | 陣列/字串/整數 | 取得主機、路徑、查詢字串等結構化部分 |
| parse_str | 解析查詢字串 | 無(引用參數) | 將 key=val&foo=bar 轉為陣列或變數 |
兩者組合使用:parse_url() 取得 query 部分 → parse_str() 解析為陣列,是處理複雜 URL 參數的標準模式。