我在查询字符串中传递带有点的变量.Php正在用低于分数替换点。那么如何保留名称中包含点的变量名称
http://localhost/sample.php?one.txt=on&two.txt=on
sample.php
$ ret = $ _ REQUEST ['one.txt']; //无效
答案 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;
}