PHPのpreg_replace()で「The /e modifier is deprecated」となる場合の対処方法

  • 投稿 : 2016-01-15
preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead 
wp-content/plugins/brBrbr300/brBrbr.php:24

Wordpressの「brBrbr」 プラグインですが、上記のようなワーニング(エラー)が出ているので、対応してみました。

PHP 5.5.0 以降で "\e" 修飾子を使うと、 E_DEPRECATED レベルのエラーが発生します。 PHP 7.0.0 以降では E_WARNING レベルのエラーが発生し、 "\e" 修飾子は何の効力も持たなくなります。


7.0.0 /e 修飾子をサポートしなくなりました。かわりに preg_replace_callback() を使いましょう。


5.5.0 /e 修飾子が非推奨になりました。かわりに preg_replace_callback() を使いましょう。 セキュリティ上のリスクの関する詳細は PREG_REPLACE_EVAL のドキュメントを参照ください。
PHP: preg_replace - Manual

原因はこれですね。
preg_replace_callback関数に置き換えればOKみたいです。

対処方法

■修正前
$brbr = preg_replace('/(<form.*?>)(.*?)<\/form>/ise', "clr_br('$0')", $brbr);

■修正後
$brbr = preg_replace_callback('/(<form.*?>)(.*?)<\/form>/is', function($m) {return clr_br($m[0]);}, $brbr);

数か所ありますが、すべて同じような変更になるかと思います。
preg_replace_callbackに置き換えて、anonymous function(無名関数)を使用して修正後のように書き換えるだけです。

参考:
PHP7でpreg_replaceのe修飾子の挙動が変わるので要注意です。 - Qiita
php - Replace deprecated preg_replace /e with preg_replace_callback - Stack Overflow
PHPのpreg_replace()で「The /e modifier is deprecated」となる場合の対処方法: 小粋空間
PHP: preg_replace_callback - Manual

2つめ、3つめの変更方法を参考にしました。

関係ない話

「brBrbr」 プラグインは、最近は使ってない人のほうが多いんでしょうか?
英語圏のBloggerとかでも、「Enter キーを押して改行 」とかをサポートしてるんですけどね。

補足:brBrbrのPHP7対応

■修正前
$brbr = preg_replace('/(<pre.*?>)(.*?)<\/pre>/ise', "clr_br('$0')", $brbr);
$brbr = preg_replace('/(<script.*?>)(.*?)<\/script>/ise', "clr_br('$0')", $brbr);
$brbr = preg_replace('/(<form.*?>)(.*?)<\/form>/ise', "clr_br('$0')", $brbr);

■修正後
$brbr = preg_replace_callback('/(<pre.*?>)(.*?)<\/pre>/is', function($m) {return clr_br($m[0]);}, $brbr);
$brbr = preg_replace_callback('/(<script.*?>)(.*?)<\/script>/is', function($m) {return clr_br($m[0]);}, $brbr);
$brbr = preg_replace_callback('/(<form.*?>)(.*?)<\/form>/is', function($m) {return clr_br($m[0]);}, $brbr);

こんな感じになる。


スポンサーリンク