故あって、php用フレームワークであるEthnaをphp 7.0環境に移す必要がありました。
その際に、最終更新の古いフレームワークなので仕方がないのですが、下位互換性が無い変更である、「preg_replaceでのe修飾子」でエラーが発生しました。
Ethna内各所で使われているpreg_replaceをpreg_replace_callbackに書き換える必要に迫られたのですが、マニュアルを読んだところ、
恐らく挙動についての説明はされているのだと思いますが、どうにもイマイチ理解が出来ませんでした。
http://php.net/manual/ja/function.preg-replace-callback.php
私と同レベルの方が引っかかった時のために、限定的な用途のためのpreg_replace_callbackの使い方について書き残しておきます。
※やりたいこと
文頭と、アンダーバーの直後の一文字を大文字にしつつ、アンダーバーを除去する
例:文字列"abc_abc_abc_abc"を、AbcAbcAbcAbcに置換する
$action = "abc_abc_abc_abc";
//以前の処理
$val1 = preg_replace('/_(.)/e', "'/' . strtoupper('\$1')", ucfirst($action));
//Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in ...
//7.0でも怒られない処理
$val2 = preg_replace_callback('/_(.)/', function($match){
//$match[0]:_a
//$match[1]:a
return strtoupper($match[1]);
}, ucfirst($action));
//$val2:AbcAbcAbcAbc
callback関数の引数$match
は、マッチした文字列全体が$match[0]
に入ります。
$match[1]
以降には、後方参照のために()
で括った部分が順に入ります。