首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 解析 URL 參數完整教學:parse_url 與自訂函數實作

     編輯:PHP 相關知識

在處理網址字串時,常需拆解協定、主機、路徑、查詢參數等組成部分。PHP 內建 parse_url() 提供標準化解析,搭配 parse_str() 可快速將查詢字串轉為陣列。本文詳細說明用法、回傳結構與自訂函數替代方案。

一、parse_url() 基本用法

<?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

二、取得查詢參數陣列:parse_str()

<?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() 無第二個參數時會直接將變數註冊到目前符號表(舊版行為),強烈建議永遠傳入第二個參數 接收陣列,避免變數汙染與安全風險。

三、完整封裝函數:getUrlParams()

<?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()。
  • PHP 版本差異:PHP 5.3.3 以前對不含 scheme 的網址解析行為不同,建議統一補上 https:// 再解析。

六、替代方案:正則表達式手動解析(不推薦)

早期教學常見手寫 explode('&', $query) 再 explode('=', $v),但無法正確處理:

  • 值中包含 = 或 &(需 URL 編碼)
  • 陣列參數 key[]=val
  • 重複參數名(PHP 只保留最後一個)

除非在極度受限環境無法使用標準函數,否則請優先使用 parse_url + parse_str。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved