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

PHP 解析 URL 利器:parse_url 与 parse_str 实战详解

     編輯:PHP 綜合知識

两大函数定位

  • parse_url():将完整 URL 拆解为组件(scheme、host、path、query 等)
  • parse_str():将查询字符串(query string)解析为变量/数组

parse_url() 深度解析

函数签名

mixed parse_url(string $url, int $component = -1)
  • 不验证 URL 合法性,尽力解析
  • 无效字符会被替换为 _

返回值

省略 $component 返回关联数组,可能包含键:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

指定 PHP_URL_PORT 返回 int,其余返回 string;组件不存在返回 NULL。

实战示例

<?php
$url = 'https://user:pass@host:8080/path?arg=val#anchor';
print_r(parse_url($url));
echo parse_url($url, PHP_URL_PATH); // /path
?>

parse_str() 详解

函数签名

void parse_str(string $str, array &$arr = null)
  • 不传 $arr 会污染当前符号表(不推荐)
  • 传 $arr 将结果存入数组,键名自动处理 [] 语法

示例

<?php
$str = 'first=value&arr[]=foo+bar&arr[]=baz';
parse_str($str, $out);
print_r($out);
/*
Array
(
    [first] => value
    [arr] => Array ( [0] => foo bar, [1] => baz )
)
*/
?>

实战案例:解析 Redis DSN(源自 php-resque)

Redis 连接字符串格式:redis://user:pass@host:port/db?opt1=val1&opt2=val2,与 URL 结构高度一致。

<?php
public static function parseDsn($dsn) {
    if ($dsn === '') $dsn = 'redis://' . self::DEFAULT_HOST;
    $parts = parse_url($dsn);
    // 校验 scheme
    if (isset($parts['scheme']) && !in_array($parts['scheme'], ['redis', 'tcp'])) {
        throw new InvalidArgumentException('Invalid scheme');
    }
    // parse_url 可能把 host 当成 path
    if (!isset($parts['host']) && isset($parts['path'])) {
        $parts['host'] = $parts['path'];
        unset($parts['path']);
    }
    $port = isset($parts['port']) ? intval($parts['port']) : self::DEFAULT_PORT;
    $db = isset($parts['path']) ? intval(preg_replace('/[^0-9]/', '', $parts['path'])) : false;
    $options = [];
    if (isset($parts['query'])) {
        parse_str($parts['query'], $options); // 关键:query string → 关联数组
    }
    return [$parts['host'], $port, $db, $parts['user'] ?? false, $parts['pass'] ?? false, $options];
}
?>

常见坑与技巧

  • parse_url('https://example.com') 无 path 键,需容错
  • 相对路径 //host/path 无 scheme,host 会被识别
  • parse_str 会将 . 空格 转为 _,键名规范化
  • 大数组建议显式传 $arr 避免变量污染
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved