4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

preg_replace_callbackにおける後方参照

Posted at

故あって、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]以降には、後方参照のために()で括った部分が順に入ります。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?