PHP 用下划线替换空格
2022-08-30 20:48:05
我有一个问题,PHP在POST和GET变量中用下划线替换所有空格。
例如,如果我有URL:浏览器会将其转换为.http://localhost/proxy.php?user name=Maxhttp://localhost/proxy.php?user%20name=Max
但是,如果我给出 $_GET 参数,则键不是 but(注意下划线)!user nameuser_name
有没有可能改变这种行为?
我有一个问题,PHP在POST和GET变量中用下划线替换所有空格。
例如,如果我有URL:浏览器会将其转换为.http://localhost/proxy.php?user name=Maxhttp://localhost/proxy.php?user%20name=Max
但是,如果我给出 $_GET 参数,则键不是 but(注意下划线)!user nameuser_name
有没有可能改变这种行为?
从 PHP 手册中可以看出:
传入变量名称中的点
通常,PHP 在将变量传递到脚本中时不会更改变量的名称。但是,应该注意的是,点(句点,句号)不是PHP变量名称中的有效字符。出于这个原因,看看它:
<?php $varname.ext; /* invalid variable name */ ?>现在,解析器看到的是一个名为 $varname 的变量,后跟字符串串联运算符,后跟裸字符串(即与任何已知键或保留字都不匹配的未加引号字符串)'ext'。显然,这没有预期的结果。
因此,请务必注意,PHP 会自动将传入变量名称中的任何点替换为下划线。
以及页面上的评论:
PHP 转换为 _( 下划线)的字段名称字符的完整列表如下(不仅仅是点):
chr(32) ( ) (space) chr(46) (.) (dot) chr(91) ([) (open square bracket) chr(128) - chr(159) (various)PHP 不可逆地修改包含这些字符的字段名称,以尝试保持与已弃用的 register_globals 功能的兼容性。
我认为获得所需参数的唯一可能性是使用自行解析它们:$_SERVER['QUERY_STRING']
$a_pairs = explode('&', $_SERVER['QUERY_STRING']);
foreach($a_pairs AS $s_pair){
$a_pair = explode('=', $s_pair);
if(count($a_pair) == 1) $a_pair[1] = '';
$a_pair[0] = urldecode($a_pair[0]);
$a_pair[1] = urldecode($a_pair[1]);
$GLOBALS['_GET'][$a_pair[0]] = $a_pair[1];
$_GET[$a_pair[0]] = $a_pair[1];
}