php 拼接的时候 去除引号,php去除魔术引号

在php 5.4之前,默认会开启魔术引号,也就是请求一个php脚本时php会为$_GET,$_POST,$_COOKIE等的某些字体添加反斜线,相当于自动执行了addslashes()函数,这些字符包括单引号(‘),双引号(“),反斜线(\),NULL字符等,比如s’s会变成s\’s。据说这样做是为了安全,但实际我们使用这些变量里面的值时需要的是真实值,就需要stripslashes()一下,需要递归的对键和值都进行这么个操作。

一开始还不怎么明白是怎么个自动为$_GET等加上反斜线,于是我把magic_quotes_gpc打开,重启apache,定义$_GET[‘a’] = “s’s”;接着var_dump($_GET),值没变啊,没自动加上反斜线啊。实在是囧了,这里就说的自动添加,是这个请求传递过来的get/post参数里边自动添加,自已定义的是多少就多少,不会被添加。比如在1.html的表单input框,name=”s’s”,value=”s’s”,post提交到2.php,在2.php中打印$_POST,这时得到的是$_POST[“s\’s”] = “s\’s”,说的是这么个自动添加。

由于post过来的可能是多维数组,需要递归的对键和值同时进行stripslashes()操作。这该怎么写呢,我们看Yii Framework中的做法:

function myTrip(&$data)

{

if(is_array($data))

{

if(count($data) === 0)

{

return $data;

}

else

{

$keys = array_map('a', array_keys($data));

$data = array_combine($keys, array_values($data));//新数组

return array_map('myTrip', $data);//键已被处理,再处理值

}

}

else

{

return a($data);

}

}

function a($value)

{

return $value.'good';

}

$arr = array('key'=>'value', 'c'=>array('ddd'=>'eee'));

$arr = myTrip($arr);

echo '

';

var_dump($arr);

/*结果如下

array(2) {

["keygood"]=>

string(9) "valuegood"

["cgood"]=>

array(1) {

["dddgood"]=>

string(7) "eeegood"

}

}

*/

这里用a函数替代stripslashes,为键和值添加’good‘字符串。可以看到,它的做法是先取所有一级的键,通过函数处理后用处理后的键和之前的值组成新数组,将新数组作为array_map()参数递归调用自身,没错,是递归。对于递归一向是比较难理解的,前面文章有画过图,这里本来也打算画一下的,无奈自己在纸上画出来的用visio等软件就画不出来了,哎,还是算了。在这里或许想到不用递归用array_walk_recursive()调用a函数,其实是不行的,原因是array_walk_recursive只会把递归的把数组的值传过去,而不会把键传过去,因此二级之后的键就不会被处理了。这里myTrip里边的参数是否为引用不影响结果,引用的话听说会快一点,当然纯猜测。

递归虽然被说慢,但一些情况不用它,还真想不到什么办法。^.^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值