PHP用下划线替换空格

use*_*724 17 php

我有问题,PHP用POST和GET变量中的下划线替换所有空格.

例如,如果我有URL:http://localhost/proxy.php?user name = Max,浏览器会将其转换为http://localhost/proxy.php?user%20name = Max.

但是如果我给出$ _GET参数,那么键不是用户名而是user_name!

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

Gre*_*reg 34

PHP手册:

输入变量名称中的点

通常,PHP在传递到脚本时不会更改变量的名称.但是,应该注意,点(句点,句号)不是PHP变量名中的有效字符.出于这个原因,看看它:

<?php $varname.ext;  /* invalid variable name */ ?>
Run Code Online (Sandbox Code Playgroud)

现在,解析器看到的是一个名为$ varname的变量,后跟字符串连接运算符,后跟barestring(即不带引号的字符串,它与任何已知的密钥或保留字不匹配)'ext'.显然,这没有预期的结果.

因此,请务必注意PHP会自动使用下划线替换传入变量名中的任何点.

并在页面上发表评论:

PHP转换为_(下划线)的字段名称字符的完整列表如下(不仅仅是点):

chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)
Run Code Online (Sandbox Code Playgroud)

PHP不可逆地修改包含这些字符的字段名称,以尝试保持与已弃用的register_globals功能的兼容性.


Rud*_*udi 5

我认为获得所需参数的唯一可能性是使用$_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];
}
Run Code Online (Sandbox Code Playgroud)