跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何将 URL 查询字符串安全解析为 PHP 关联数组

本文介绍使用 php 内置函数 `parse_str()` 将 `http_build_query()` 生成的 url 参数字符串准确还原为原始关联数组,避免手动分割导致的键值解析错误。 在 Web 开发中,我们常通过 http_build_query() 将关联数组序列化为标准的 URL 查询字符串(如 approval=1&record=8&employee=2),用于构造跳转链接或 API 请求参数。但当需要从该字符串反向还原为 PHP 数组时, 切勿使用 explode('&', $str) 配合json_encode() ——这种方式仅得到带等号的字符串片段数组(如 ["approval=1", "record=8"]),完全丢失了 键值对 结构,也无法正确处理 URL 编码 、空格、特殊字符(如 +、%20、& 在值中)等边界情况。 ✅ 正确且唯一推荐的方式是使用 PHP 原生函数:parse_str()。
// 假设这是你通过 http_build_query 生成的查询字符串 $approve = http_build_query([ "approval" => 1, "record" => $recordId, // 例如 8 "employee" => $userid, // 例如 2 "hod" => 9 ]); // $approve 的值示例: "approval=1&record=8&employee=2&hod=9" // 安全、标准、自动解码地还原为关联数组 parse_str($approve, $array); // 此时 $array 即为原始结构: // [ // 'approval' => '1', // 'record' => '8', // 'employee' => '2', // 'hod' => '9' // ] print_r($array);
⚠️ 注意事项: parse_str() 会自动对 URL 编码内容进行解码 (如 %20 → 空格,+ → 空格),无需额外调用 urldecode(); 第二个参数 $array 是 引用传参 ,函数本身无返回值,务必传入一个变量名; 若需转换为 JSON,可在解析后使用 json _encode($array),而非对原始字符串操作; 不要省略第二个参数(即不要写 parse_str($approve)),否则解析结果将注入到当前 作用域 的变量中(如 approval、record 变量),存在安全隐患和命名冲突风险。 ? 扩展提示:若需兼容更复杂的嵌套数组(如 user[name]=John&user[age]=30),parse_str() 同样支持(PHP 7.2+ 默认启用 PHP_INI_SYSTEM 兼容模式),但建议对关键业务数据做 is_array() 和 isset() 校验,确保结构预期。 立即学习 “ PHP免费学习笔记(深入) ”; 总之,parse_str() 是专为解析 URL 查询字符串而生的标准工具——简洁、健壮、符合 RFC 规范,应作为首选方案。

相关文章