preg_replace_callback解读 · HH blog

前言

前几天看php手册匿名函数一章时,看到示例

1
2
3
4
5
6

echo preg_replace_callback('~-([a-z])~', function ($match) {
return strtoupper($match[1]);
}, 'hello-world');

?>

初看时,对这三行代码有点懵…一时没转过来,没想明白为什么是这结果,这是为什么呢?

正则定界符

其实刚开始是对 ‘~-([a-z])~‘ 比较懵,正则表达式虽然写了不少,但也仅限于使用时对照手册,没有深入了解…在翻阅资料后恍然大悟.

平日里写正则表达式默认是以反斜线//作为正则表达式的定界符,因缺少探索,久而久之理所当然的默认定界符只能用//

然而资料里关于定界符的描述是这样的

定界符,也称为分隔符,一般为正斜杠 (正斜线)/,但实际上除了字母、数字和反斜线以外的任何字符都可以作为定界符号,只要前后成对出现即可,比如##、||、//、{}、!!、%% 等等。

也就是说,只要你喜欢,你可以用 {} [] %% $$ 等等作为定界符…不过,在没有特殊情况下,还是用建议用//

看懂这则正则表达式,再来看上面这个示例就会变得简单起来了.

preg_replace_callback

preg_replace_callback的官方文档里,是这样描述的

preg_replace_callback ( mixed $pattern , callable $callback , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
这个函数的行为除了 可以指定一个 callback 替代 replacement 进行替换 字符串的计算,其他方面等同于 preg_replace()

那上面的示例可以理解为

大专栏   preg_replace_callback解读 · HH blogure class="highlight php">
1
2
3
4
5
6
7
8
9
10
11

$string = 'hello-world';
preg_match('/-([a-z])/', 'hello-world', $match);
//$match = [ [0] => -w [1] => w ]
$match[1] = strtoupper($match[1]);
foreach ($match as $v){
$string = preg_replace(['~-([a-z])~'], $v, $string);
}
echo $string;

?>

实战

知道 preg_replace_callback 的原理后,我们把最上面的例子稍微修改下

1
2
3
4
5
6

echo preg_replace_callback('/_([a-z])/', function ($match) {
return strtoupper($match[1]);
}, 'preg_replace_callback');
// 输出 pregReplaceCallback
?>

上面修改后的例子就可以在实战中用来把下划线命名法(UnderScoreCase)替换成驼峰命名法(CamelCase)
不考虑性能消耗的情况

总结

时刻保持探索精神,遇到让人懵逼的问题,及时补充,消灭它.当你查资料文档解决问题的时候,无形中补充了自己的知识面

猜你喜欢

转载自www.cnblogs.com/lijianming180/p/12401825.html
hh
.hh
今日推荐