• 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)
    不考虑性能消耗的情况

    总结

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

  • 相关阅读:
    Python学习第15天_模块
    Python学习第14天_文件读取写入
    Python学习第13天_练习(图书馆的创建)
    Python学习第12天_类
    Python学习第11天_参数
    Python学习第10天_函数
    Python学习第九天_模块的应用
    Android Bluetooth HIDL服务分析
    Mac下CLion配置Google GTest小结
    MacOS通过homebrew安装老版本的软件
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12401825.html
Copyright © 2020-2023  润新知