PHP7下preg_replace_callback_array函数解析

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个参数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章