
本文介绍使用 PHP 内置函数 parse_str() 将标准 URL 查询字符串(如 Postman 发送的 raw form-data 或 x-www-form-urlencoded 数据)安全、高效地转换为关联数组的方法,并附带注意事项与实用示例。
本文介绍使用 php 内置函数 `parse_str()` 将标准 url 查询字符串(如 postman 发送的 raw form-data 或 x-www-form-urlencoded 数据)安全、高效地转换为关联数组的方法,并附带注意事项与实用示例。
在 PHP 开发中,经常需要处理来自前端、第三方 API 或测试工具(如 Postman)提交的 URL 编码格式数据,例如:
rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09%2016%3A33%3A16&sender_id=TESS&receiver_id=SGRQWES
这类字符串本质上是 application/x-www-form-urlencoded 格式,其键值对以 & 分隔、= 连接,且值通常经过 urlencode() 处理(空格 → %20,冒号 → %3A 等)。PHP 提供了专为此场景设计的函数:parse_str()。
✅ 正确用法:解析为关联数组
parse_str() 的核心优势在于——它会自动解码 URL 编码(即执行等效于 urldecode() 的操作),并支持直接输出到指定数组变量,避免污染当前作用域:
<?php $queryString = 'rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09%2016%3A33%3A16&sender_id=TESS&receiver_id=SGRQWES'; // 第二个参数传入目标数组变量(按引用修改) parse_str($queryString, $params); print_r($params); ?>
输出结果:
立即学习“PHP免费学习笔记(深入)”;
Array
(
[rq_uuid] => e53473de-0483-44f5-91f0-2be74e58c277
[rq_datetime] => 2022-03-09 16:33:16
[sender_id] => TESS
[receiver_id] => SGRQWES
)? 注意:即使原始字符串中 rq_datetime 的空格和冒号被编码为 %20 和 %3A,parse_str() 也会自动还原为可读格式,无需手动调用 urldecode()。
⚠️ 关键注意事项
- 不推荐省略第二个参数:若仅写 parse_str($str) 而不传入数组变量,函数会将键名作为变量名在当前作用域创建变量(如 $rq_uuid),这易引发命名冲突与安全风险,应始终显式传入目标数组。
- 输入需为合法查询字符串格式:确保字符串不含开头的 ?(如 ?rq_uuid=...),否则需先 ltrim($str, '?');也建议在解析前做基础校验(如非空、含 =)。
- 不处理嵌套结构或数组语法:parse_str() 仅支持扁平键值对(如 a=1&b=2),不原生支持 a[]=1&a[]=2 或 a[b]=1 等复杂格式(如需,可配合正则或专用库如 http_build_query() 反向逻辑处理)。
- 字符编码兼容性:默认按当前脚本编码(通常是 UTF-8)解码;若源数据为其他编码(如 GBK),需先转换编码再解析。
? 实用封装示例(增强健壮性)
<?php
function queryStringToArray(string $query): array
{
if (empty(trim($query))) {
return [];
}
// 移除可能的前导 '?' 并清理空白符
$cleanQuery = ltrim(trim($query), '?');
$result = [];
parse_str($cleanQuery, $result);
return $result;
}
// 使用示例
$input = 'rq_uuid=e53473de-0483-44f5-91f0-2be74e58c277&rq_datetime=2022-03-09%2016%3A33%3A16&sender_id=TESS';
$params = queryStringToArray($input);
var_dump($params);
?>✅ 总结
parse_str($string, $array) 是 PHP 解析 URL 编码查询字符串最标准、最轻量、最可靠的方式。它集解码、分割、赋值于一体,语义清晰、性能优异。在接收 Postman 测试请求、解析回调参数、处理 Webhook payload 等场景中,应优先选用该函数,并始终通过第二个参数接收结果,以保障代码的可维护性与安全性。











