以变​​量名称加点

时间:2009-06-29 10:30:55

标签: php query-string

我在查询字符串中传递带有点的变量.Php正在用低于分数替换点。那么如何保留名称中包含点的变量名称

http://localhost/sample.php?one.txt=on&two.txt=on

sample.php

$ ret = $ _ REQUEST ['one.txt']; //无效

3 个答案:

答案 0 :(得分:27)

PHP将您的变量名从one.txt转换为one_txt的原因是因为点在变量名中无效。

有关详细信息,请查看PHP Documentation

  

变量名称遵循相同的规则   作为PHP中的其他标签。一个有效的   变量名以字母或开头   下划线,后跟任意数量的   字母,数字或下划线。作为一个   正则表达式,它会   表达如下:   '[A-ZA-Z_ \ x7f- \ XFF] [A-ZA-Z0-9_ \ x7f- \ XFF] *'

您可以考虑更改(._)并检查$_REQUEST['one_txt'],也可以让HTML表单传递有效的变量名称。

编辑:

跟进Michael Borgwardt的评论,这是来自PHP's documentation about handling variables from external sources的文字:

  

传入变量名称中的点

     

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

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

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

     

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

这确实是PHP特有的。

答案 1 :(得分:6)

使用$ _SERVER ['QUERY_STRING']

$get = array();
foreach(explode('&', $_SERVER['QUERY_STRING']) as $part)
    {
    $part = explode('=', $part);
    if($key = array_shift($part))
        {
        $get[ $key ] = implode('', $part);
        }
    }
print_r($get);

您的示例的结果     数组([one.txt] =&gt; on [two.txt] =&gt; on)

答案 2 :(得分:4)

PHP开发人员实现了这一点以支持register_globals(),但是如果他们暂停超过一秒钟来考虑后果,那么他们只会改变导入全局变量命名空间的名称,而不是$ _POST本身。改变请求变量本身的理由不足......好吧,除了让PHP无法处理标准表单提交之外。

这也是POST变量的解决方案,对于比GET解决方案更多的用户来说可能更棘手:

function post_data(){    
   $data=explode('&',file_get_contents("php://input"));
   $post=array();
   foreach ($data as $var){
      list($key,$value)=explode('=',$var,2);
      $post[$key]=urldecode($value);
   }
   return $post; 
}