parse_str() 不自动创建变量,必须传入数组参数接收结果;不支持方括号嵌套语法;不处理编码转换,需确保输入为合法url编码格式。

parse_str() 解析失败:变量没被赋值?
默认情况下 parse_str() 不会自动创建变量,它只往当前作用域写入,但 PHP 默认禁用 register_globals(早就不支持了),所以直接调用 parse_str("a=1&b=2") 后,$a 和 $b 并不存在。
- 必须传入第二个参数,用数组接收结果:
parse_str("a=1&b=2", $output),之后读$output['a'] - 如果硬要“注入”变量到当前作用域,得手动提取:
foreach ($output as $k => $v) $$k = $v;,但不推荐——容易覆盖已有变量,调试时极难追踪 - 注意:传入的字符串不能含空格或换行,否则解析中断;URL 中的
+会被当空格处理(符合标准),但原始字符串里写"a=hello+world"会被转成hello world
中文和特殊字符乱码:编码没对齐
parse_str() 完全不处理编码转换,它只按字节拆分 = 和 &,然后 URL 解码(urldecode() 级别)。如果你的查询字符串是 UTF-8 编码但页面或脚本文件存为 GBK,解出来就是乱码。
- 确保原始字符串本身是合法的 URL 编码格式,比如中文应为
%E4%BD%A0%E5%A5%BD,而不是裸字符串你好 - 不要在调用前手动
urldecode()——parse_str()内部已做,重复解码会导致错误(如%2520变成空格再变乱码) - 如果来源是
$_SERVER['QUERY_STRING'],它已是解码过的,直接传给parse_str()会出错;应先rawurlencode()回去再解,或改用$_GET(更安全)
嵌套数组写法不支持:别指望它解析 [ ]
parse_str() 原生不识别类似 foo[bar]=1 这种 PHP 风格的数组语法。它只会把键名原样当作字符串,得到 ['foo[bar]' => '1'],不是你想要的 ['foo' => ['bar' => '1']]。
- 这是最常踩的坑:以为能像
$_GET一样自动展开,其实不能 - 如果必须支持方括号语法,得自己写正则或用
parse_str()+ 二次解析,例如匹配/([^[]+)\[([^\]]+)\]/拆出层级 - 更稳妥的做法是避开这种格式,改用扁平 key,比如
foo_bar=1,或直接走 JSON 查询参数(data=%7B%22foo%22%3A%7B%22bar%22%3A1%7D%7D),再json_decode(urldecode($data), true)
性能与边界:大字符串、空值、重复 key
对几 KB 以内的查询字符串,parse_str() 没压力;但超过 1MB 或含上万参数时,PHP 会明显变慢,且可能触发 max_input_vars 限制(虽然这主要是针对 $_POST,但原理类似)。
- 重复 key 如
a=1&a=2,后面值会覆盖前面,最终只留$output['a'] = '2';若需保留全部,得先explode('&')手动拆,再逐个explode('=', $pair, 2) - 空值处理:
a=&b=1→['a' => '', 'b' => '1'];a&b=1(无等号)→['a' => '', 'b' => '1'];这点和$_GET行为一致 - key 名里含点(
.)或空格会被转成下划线(_),比如a.b=1→$output['a_b'] = '1',这是 PHP 内部变量名标准化逻辑,无法关闭
$_GET 更省心;非得手解析时,记住三件事:一定要用数组接收、别碰方括号语法、中文务必确认编码链完整。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











