mixed parse_url(string $url, int $component = -1)
_省略 $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 ?>
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 连接字符串格式: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 避免变量污染