PHP7でpreg_replaceのe修飾子の挙動が変わるので要注意です。

More than 1 year has passed since last update.

TL;DR

  • PHP5.5からpreg_replaceのe修飾子はDEPRECATED扱いとなっていたが、一応動いてはいた。
  • PHP7では、preg_replaceのe修飾子を使うと、Warningを吐きつつNULLを返す。
  • PHP5.5時代にpreg_replaceに@を書いてお茶を濁した人は、PHP7で地雷を踏む。

解説

このコードをご覧ください。

a.php
$string = "hello world";
$string2 =  preg_replace('/(world)/e', "strtoupper('\$1')", $string);

var_dump($string2);

"hello world"のうちの"world"を大文字に変換するコードです。

PHP5.5/5.6の場合

php5.5やPHP5.6だと実行結果はこうなります。

PHP Deprecated:  preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /Users/DQNEO/a.php on line 3

string(11) "hello WORLD"

Deprecatedが出つつも、ちゃんと適用されて"world"が大文字の"WORLD"になります。

PHP7.0.0alpha1の場合

a.php
PHP Warning:  preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /Users/DQNEO/a.php on line 3

NULL

おわかりでしょうか。
戻り値がNULLに変わっています。

@でお茶を濁してた人は致命的バグになる

PHP5.5時代に、「Deprecatedが出なければそれでいいや」と考えて

@preg_replace

と頭に@をつけてごまかした人は、PHP7時代になるとWarningが出ないまま戻り値がNULLに変わってしまうので、わかりにくいバグの原因になることでしょう。

まとめ

preg_replace_callback使え

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.