PHP用下划线替换空格

时间:2008-11-12 12:10:36

标签: php

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

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

但是如果我输出$ _GET参数,则键不是用户名,而是 user_name

是否有可能改变这种行为?

4 个答案:

答案 0 :(得分:34)

来自PHP manual

  

传入变量名称中的点

     

通常,PHP不会改变   变量的名称   传入剧本。但是,它   应该注意点(期间,   完全停止)不是一个有效的角色   一个PHP变量名。由于这个原因,   看看它:

<?php $varname.ext;  /* invalid variable name */ ?>
     

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

     

因此,重要的是   请注意PHP将自动   替换传入变量中的任何点   带下划线的名字。

并在页面上发表评论:

  

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

chr(32) ( ) (space)
chr(46) (.) (dot)
chr(91) ([) (open square bracket)
chr(128) - chr(159) (various)
     

PHP不可逆转地修改包含这些字符的字段名称,以保持与不推荐使用的register_globals功能的兼容性。

答案 1 :(得分: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];
}

答案 2 :(得分:3)

在register_globals的旧时代,查询字符串被PHP解压缩为全局变量,但变量标识符的格式受到限制,因此显然空格不起作用。这种限制仍然存在,老实说,我认为保持这种方式是一个好主意。

如果您确实无法在URL中将空格更改为下划线,则只需在处理请求时将$ _GET数组置换,并用空格替换每个下划线。

答案 3 :(得分:1)

据我所知,我从未在URL参数名称中看到空格......

我认为,将参数名称的所有空格转换为“_”会更好。