在處理網址字串時,常需拆解協定、主機、路徑、查詢參數等組成部分。PHP 內建 parse_url() 提供標準化解析,搭配 parse_str() 可快速將查詢字串轉為陣列。本文詳細說明用法、回傳結構與自訂函數替代方案。
<?php
$url = "https://www.example.com/welcome/";
$parts = parse_url($url);
print_r($parts);
/* 輸出:
Array
(
[scheme] => http
[host] => www.example.com
[path] => /welcome/
)
*/
$url:欲解析的網址字串,不完整網址亦可嘗試解析。$component(可選):指定回傳特定元件常數,如 PHP_URL_SCHEME、PHP_URL_HOST、PHP_URL_PATH、PHP_URL_QUERY 等,回傳字串而非陣列。| 常數 | 說明 | 範例值 |
|---|---|---|
| PHP_URL_SCHEME | 協定 | http、https、ftp |
| PHP_URL_HOST | 主機名 | www.example.com |
| PHP_URL_PORT | 連接埠 | 80、443 |
| PHP_URL_USER | 使用者名稱 | user |
| PHP_URL_PASS | 密碼 | pass |
| PHP_URL_PATH | 路徑 | /path/to/page |
| PHP_URL_QUERY | 查詢字串 | id=123&name=abc |
| PHP_URL_FRAGMENT | 錨點 | section1 |
<?php
$url = '/index.php?_p=index&_a=show&x=12&y=23';
$parts = parse_url($url);
$query = $parts['query']; // "_p=index&_a=show&x=12&y=23"
$params = array();
parse_str($query, $params);
print_r($params);
/* 輸出:
Array
(
[_p] => index
[_a] => show
[x] => 12
[y] => 23
)
*/
注意: parse_str() 無第二個參數時會直接將變數註冊到目前符號表(舊版行為),強烈建議永遠傳入第二個參數 接收陣列,避免變數汙染與安全風險。
<?php
/**
* 解析 URL 並回傳查詢參數關聯陣列
* @param string $url 完整或相對網址
* @return array 參數鍵值對,失敗回傳空陣列
*/
function getUrlParams($url) {
$parts = parse_url($url);
if (empty($parts['query'])) return array();
$params = array();
parse_str($parts['query'], $params);
return $params;
}
// 使用範例
$url = "https://api.example.com/v1/users?status=active&page=2&limit=20";
$params = getUrlParams($url);
// $params = ['status'=>'active', 'page'=>'2', 'limit'=>'20']
?>
若查詢字串包含陣列語法(如 tags[]=php&tags[]=js),parse_str 會自動轉為 PHP 陣列:
$query = "tags[]=php&tags[]=js&tags[]=css";
parse_str($query, $params);
// $params['tags'] = ['php', 'js', 'css']
若需保留原始編碼格式,可搭配 rawurldecode() 處理值。
parse_url 僅拆解字串,不檢查網址是否真實存在或格式完全符合 RFC。/path?query=1,scheme 與 host 會不存在,需自行補齊。urldecode()。https:// 再解析。早期教學常見手寫 explode('&', $query) 再 explode('=', $v),但無法正確處理:
= 或 &(需 URL 編碼)key[]=val除非在極度受限環境無法使用標準函數,否則請優先使用 parse_url + parse_str。