最近在网上看到有人提到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个的元素;