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

PHP URL 解析利器:parse_url 與 parse_str 深度解析

     編輯:PHP 綜合知識

PHP 提供兩大核心函數解析 URL:parse_url() 拆解 URL 結構,parse_str() 解析查詢字串為變數。兩者結合可輕鬆處理複雜的 URL 與資料傳遞場景。

一、parse_url():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

二、parse_str():查詢字串解析器

函數原型

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 DSN 連線字串

來源:php-resque 原始碼

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 參數的標準模式。

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