PHP7中PCRE增加了一个新的函数,那就是preg_replace_callback_array。
在此之前,PCRE中就已经有了preg_replace_callback,那这两者之间又有什么共同点和区别
首先复习一下preg_replace_callback的函数定义。
mixed preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] )
其中,$pattern可以是string或array类型。
再来先看下方代码:
<?php
$subject = 'hello world!';
$replaced = preg_replace_callback([
'#(hello)#',
'#(world)#',
], function ($matches) {
return strtoupper($matches[1]);
}, $subject);
echo $replaced;
// HELLO WORLD!
再看preg_replace_callback_array的函数定义:
mixed preg_replace_callback_array ( array $patterns_and_callbacks , mixed $subject [, int $limit = -1 [, int &$count ]] )
与preg_replace_callback对比,没有了$pattern和$callback,而是将两个结合成了一个associative的数组。
再看看示例代码:
<?php
$subject = 'Hello World';
$replaced = preg_replace_callback_array([
'#(Hello)#' => function ($matches) {
return 'Good';
},
'#(World)#i' => function ($match) {
return 'day';
}
], $subject);
echo $replaced;
// OUTPUT
// Good day
可以看出,preg_replace_callback只能针对多个pattern的匹配模式作出同一种callback行为。当然,可以在callback中实现不同的控制分支(switch/if),而preg_replace_callback_array则是通过传递pattern=>callback的associative对应关系,实现一对一的callback操作,更具清晰化。
总结:
相同点:
1)都是通过PCRE模式进行匹配,并实现替换
2)参数和返回值也基本相同,如subject为数组时,返回值为数组;subject为字符串时,返回值为字符串
不同点:
1)preg_replace_callback的pattern参数可以为字符串或数字下标的PCRE模式数组;而preg_replace_callback_array的pattern只能为keyValue的数组;
2)preg_replace_callback的callback会对pattern参数中所有的模式作相同的操作;而preg_replace_callback_array的pattern因为定义了keyValue的方式,会使用相应的key对应的callback进行处理;
3)参数数量不同:preg_replace_callback为5个参数,preg_replace_callback_array为4个参数