关于preg_replace是否已经弃用?

最近在网上看到有人提到preg_replace已经被弃用,要求帮忙将代码中使用preg_replace的地方全部用preg_repalce_callback函数转换过来。

我感到很奇怪,preg_replace什么时候被弃用了,我现在都还在使用中,平时也没有看到有什么报警;

然后我就专门查询了一下PHP手册,发现preg_replace并没有被弃用,只是其中的一个/e修饰符被弃用,并且/e修饰符是在php 5.5.0版本才被弃用的,如果使用的php是大于5.5.0的或者网站升级,将老的PHP升级到5.5.0版本以上的话,如果检测到代码中使用pre_replace的地方有使用/e修饰符,就会报一个E_DEPRECATED级别的错误,并提示要使用preg_replace_callback函数。

实际上大多数情况下,直接将/e参数去掉就可以了。

但是要注意的是,当你使用/e参数时,preg_replace会将第2个参数$replacement 返回的字符串当做一个php代码来执行。比如说$replacement 为$_POST['na'];而$_POST['n']
返回的值为phpinfo(),那么$replacement 最终的字符串就是执行phpinfo()函数返回的字符串;

另外php手册中也强烈建议不要使用/e参数,原因是/e参数会将第二个参数中包含的一些函数解析的结果作为最终的替换字符串,可能会将一些敏感信息暴露出来,让一些有心人利用;

所以强烈建议使用preg_replace_callback替换;


实际上preg_replace_callback也很简单;

这里拿php手册上的一个例子说明就可以看出来了,如下:

中文php手册的具体链接在这里http://php.net/manual/zh/reference.pcre.pattern.modifiers.php#reference.pcre.pattern.modifiers.eval

<?php
$html = $_POST['html'];


// uppercase headings
$html = preg_replace(
    '(<h([1-6])>(.*?)</h\1>)e',
    '"<h$1>" . strtoupper("$2") . "</h$1>"',
    $html
);

转换为

<?php
$html = $_POST['html'];


// uppercase headings
$html = preg_replace_callback(
    '(<h([1-6])>(.*?)</h\1>)',
    function ($m) {
        return "<h$m[1]>" . strtoupper($m[2]) . "</h$m[1]>";
    },
    $html
);

可以发现就是用一个$m[1],$m[2]替换原来的$1, $2,实际上原来的$1与$2也就是preg_replace和pre_replace_match的第一个参数,正则表达式匹配出来的数组的结果的(注意第0个元素是整个要进行匹配的字符串,后续的第1个、第2个都是使用小括号包围起来的匹配的子串)第1个和第2个的元素;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值