PHP 用下划线替换空格

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

有没有可能改变这种行为?


答案 1

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 功能的兼容性。


答案 2

我认为获得所需参数的唯一可能性是使用自行解析它们:$_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];
}

推荐