萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 解析 URL 參數完整指南:parse_url 與自定義函數

內建函數: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;
copyright © 萬盛學電腦網 all rights reserved