天天看點

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)

不考慮性能消耗的情況

總結

時刻保持探索精神,遇到讓人懵逼的問題,及時補充,消滅它.當你查資料文檔解決問題的時候,無形中補充了自己的知識面