zoukankan      html  css  js  c++  java
  • 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)
    不考虑性能消耗的情况

    总结

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

  • 相关阅读:
    POJ3709 K-Anonymous Sequence 斜率优化DP
    POJ3233 Matrix Power Series
    第六周 Leetcode 446. Arithmetic Slices II
    POJ1743 Musical Theme 最长重复子串 利用后缀数组
    Ural 1517. Freedom of Choice 后缀数组
    iOS跳转到另一个程序
    上传源码到github
    NSTimer用法,暂停,继续,初始化
    iOS中多线程原理与runloop介绍
    NSRunLoop 概述和原理
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12401825.html
Copyright © 2011-2022 走看看