You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

核心PHP中URL含空格的参数键被转为下划线的解决方案咨询

解决PHP查询字符串键中空格被转为下划线的问题

PHP默认会将查询字符串中包含空格、点号等特殊字符的参数键自动替换为下划线,导致$_GET/$_REQUEST无法保留原始键名。要解决这个问题,你需要直接解析原始的查询字符串,绕过PHP的自动处理机制。

方案:手动解析$_SERVER['QUERY_STRING']

$_SERVER['QUERY_STRING']存储了未被PHP处理的原始查询字符串,我们可以手动拆分、解码其中的键值对,完整保留原始键名。

基础版代码(处理普通参数)

<?php
$rawParams = [];
// 获取原始查询字符串
$queryString = $_SERVER['QUERY_STRING'];
// 拆分每个参数
$params = explode('&', $queryString);

foreach ($params as $param) {
    // 仅拆分一次键和值,避免值中包含=符号导致错误
    list($key, $value) = explode('=', $param, 2);
    // 解码键和值,还原原始空格
    $rawParams[urldecode($key)] = urldecode($value);
}

print_r($rawParams);
?>

访问http://localhost/user.php?A%20String=wqe%20qwe后,输出结果会是:

Array
(
    [A String] => wqe qwe
)

进阶版代码(处理重复参数)

如果存在重复参数(如?A%20String=1&A%20String=2),可以修改代码将重复值存入数组:

<?php
$rawParams = [];
$queryString = $_SERVER['QUERY_STRING'];
$params = explode('&', $queryString);

foreach ($params as $param) {
    list($key, $value) = explode('=', $param, 2);
    $decodedKey = urldecode($key);
    $decodedValue = urldecode($value);
    
    if (isset($rawParams[$decodedKey])) {
        // 若键已存在,转为数组存储多个值
        if (!is_array($rawParams[$decodedKey])) {
            $rawParams[$decodedKey] = [$rawParams[$decodedKey]];
        }
        $rawParams[$decodedKey][] = $decodedValue;
    } else {
        $rawParams[$decodedKey] = $decodedValue;
    }
}

print_r($rawParams);
?>

原理说明

PHP的变量解析规则会自动将参数键中的非字母、数字、下划线字符替换为下划线,这是$_GET/$_REQUEST无法保留空格键名的根本原因。通过直接解析原始查询字符串,我们可以完全控制键值对的解码和存储逻辑,避免这种自动替换。

内容的提问来源于stack exchange,提问作者Atul Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:52:38