parse_str() 是 php 解析 url 查询字符串为数组或变量的函数,自动解码但不过滤数据;推荐传入引用数组以避免变量污染,支持重复键名转数组、方括号嵌套语法及空值处理,需手动校验类型与安全性。

parse_str() 是 PHP 用来把 URL 查询字符串(如 name=张三&age=25&city=%E5%8C%97%E4%BA%AC)解析成 PHP 变量或关联数组的函数。它会自动处理 URL 解码(即把 %E5%8C%97%E4%BA%AC 还原为“北京”),但**不会自动过滤或转义数据**,使用时需注意安全性。
基本用法:直接解析到当前作用域变量
最简单的调用方式是只传入字符串,不指定第二个参数:
$str = "name=%E5%BC%A0%E4%B8%89&age=25&hobby=reading&hobby=coding"; parse_str($str); echo $name; // 输出:张三 echo $age; // 输出:25 print_r($hobby); // 输出:Array ( [0] => reading [1] => coding )
⚠️ 注意:这种方式会把键名作为变量名直接注入当前作用域,容易覆盖已有变量,**不推荐在函数或全局作用域中使用**。
安全用法:解析到指定数组(推荐)
传入第二个参数(必须是变量引用),结果存入该数组,避免污染作用域:
$str = "user_id=100&token=abc123&redirect=/admin"; $params = []; parse_str($str, $params); print_r($params); // 输出: // Array ( // [user_id] => 100 // [token] => abc123 // [redirect] => /admin // )
这样更可控,也方便后续校验、过滤或类型转换。
处理重复键名和特殊字符
parse_str 会按规则处理常见 URL 编码场景:
- 多个同名参数(如
a=1&a=2)→ 自动转为数组:['a' => ['1', '2']] - 带方括号的键名(如
user[name]=张三&user[age]=25)→ 解析为嵌套数组:['user' => ['name' => '张三', 'age' => '25']] - 空值(如
flag=&test)→ 对应键存在,值为''或null(取决于 PHP 版本,建议手动判断) - 未编码的特殊字符(如空格、+)会被当作字面量;
+在 URL 中默认表示空格,parse_str 会将其转为空格
注意事项与替代方案
实际开发中要注意:
- parse_str 不做输入过滤,所有值都是字符串,需自行验证类型(如
filter_var($params['age'], FILTER_VALIDATE_INT)) - 如果字符串来自用户输入(如 $_SERVER['QUERY_STRING']),务必先检查是否为空或含非法内容
- PHP 8.1+ 开始,对无效编码(如
%xx不合法)会发出E_WARNING,可配合@抑制或提前校验 - 若需解析完整 URL(含协议、路径等),应先用
parse_url()提取 query 部分,再用parse_str()
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











