最标准安全的方式是用 parse_url() 提取 query 部分,再用 parse_str() 解析为数组;需检查 parse_url 返回值,parse_str 必须传引用变量,避免作用域污染和解析错误。

PHP 截取 URL 中的查询参数,最标准、安全的方式就是用 parse_url() 配合 parse_str(),而不是手动字符串截取或正则匹配。
用 parse_url 提取查询字符串部分
parse_url() 能把 URL 拆成协议、主机、路径、查询串等组件。关键是要拿到 query 子数组:
$url = "https://example.com/path?name=张三&age=25&city=%E5%8C%97%E4%BA%AC"; $parsed = parse_url($url); // $parsed['query'] 就是 "name=张三&age=25&city=%E5%8C%97%E4%BA%AC"
注意:它不会自动解码或解析键值对,只负责拆分 URL 结构。
用 parse_str 解析查询字符串为数组
parse_str() 专门处理 key=value&key2=value2 这类格式,会自动做 URL 解码,并支持嵌套语法(如 user[name]=张三&user[age]=25):
$query = $parsed['query']; parse_str($query, $params); // $params 现在是 ['name' => '张三', 'age' => '25', 'city' => '北京']
- 第二个参数必须传变量名(不能直接写
parse_str($query)),否则结果会注入到当前作用域变量中,有安全隐患 - 如果查询参数含数组写法(如
tags[]=php&tags[]=web),parse_str会正确转成索引数组 - 空值(
?a&b=)会被解析为['a' => '', 'b' => ''],不是null
一步到位封装成函数(推荐复用)
把上面两步合并,加点容错,就能写出健壮的工具函数:
function getQueryParams(string $url): array
{
$parsed = parse_url($url);
if ($parsed === false || !isset($parsed['query'])) {
return [];
}
parse_str($parsed['query'], $params);
return $params;
}
// 使用示例
$params = getQueryParams("https://site.com/?id=123&sort=desc&filter[status]=active");
// 返回 ['id' => '123', 'sort' => 'desc', 'filter' => ['status' => 'active']]
常见误区提醒
- 不要用
explode('?', $url)[1]或substr(strrchr($url, '?'), 1)—— URL 可能不含查询参数,也可能包含带问号的路径(如/path?x=1?y=2是非法但可能出现在日志里) - 不要自己写正则去匹配
key=value—— 编码、空格、方括号数组语法、重复键等都会出错 -
parse_url对畸形 URL 返回false,务必检查返回值,避免后续报错 - 如果 URL 来自不可信来源(如用户输入),建议先过滤或验证,再解析
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











