內建函數:parse_url()
mixed parse_url(string $url, int $component = -1): mixed
// 返回關聯陣列:scheme, host, port, user, pass, path, query, fragment
基本用法
$url = "https://www.example.com/welcome/?_p=index&_a=show&x=12&y=23";
$parts = parse_url($url);
print_r($parts);
/*
Array
(
[scheme] => http
[host] => www.example.com
[path] => /welcome/
[query] => _p=index&_a=show&x=12&y=23
)
*/
提取特定元件
echo parse_url($url, PHP_URL_SCHEME); // http
echo parse_url($url, PHP_URL_HOST); // www.example.com
echo parse_url($url, PHP_URL_PATH); // /welcome/
echo parse_url($url, PHP_URL_QUERY); // _p=index&_a=show&x=12&y=23
解析查詢字串:parse_str()
$query = parse_url($url, PHP_URL_QUERY);
parse_str($query, $params);
print_r($params);
/*
Array
(
[_p] => index
[_a] => show
[x] => 12
[y] => 23
)
*/
一鍵封裝:getUrlParams()
function getUrlParams(string $url): array {
$parts = parse_url($url);
if (!isset($parts['query'])) return [];
parse_str($parts['query'], $params);
return $params;
}
// 使用
$url = '/index.php?_p=index&_a=show&x=12&y=23';
$params = getUrlParams($url);
// ['_p'=>'index', '_a'=>'show', 'x'=>'12', 'y'=>'23']
進階:解析當前請求 URL
function getCurrentUrlParams(): array {
$url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http')
. '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
return getUrlParams($url);
}
手動解析演算法(教學用)
function parseQueryManual(string $query): array {
$params = [];
$pairs = explode('&', $query);
foreach ($pairs as $pair) {
$kv = explode('=', $pair, 2); // 限制分割 2 段,值中可含 =
$key = urldecode($kv[0]);
$value = isset($kv[1]) ? urldecode($kv[1]) : '';
$params[$key] = $value;
}
return $params;
}
注意事項
parse_url() 不驗證 URL 合法性,僅分解
- 相對路徑 URL 可能缺少 scheme/host
parse_str() 會覆蓋同名參數(後者勝出),若需保留多值需自行處理
- PHP 7.3+
parse_str() 不再支援不帶第二參數寫法(會汙染符號表)
- URL 編碼:空格可能為
+ 或 %20,urldecode() 皆可處理
建構 URL 反向操作
$params = ['_p' => 'index', '_a' => 'show', 'x' => 12, 'y' => 23];
$query = http_build_query($params); // _p=index&_a=show&x=12&y=23
$url = 'https://example.com/path?' . $query;