web関連
【php】/e修飾子がphp7.3に対応していなかった時の備忘録
とあるフリーのフォームを使っていたら送信できなくなったので調べた時のメモ
実際にあったコード
/e修飾子とかいうのが原因だった
php7以降は消したら治った
https://3v4l.org/uE42a(リンク先にコード)
. e
の部分消した正常に動くようになったんだけど何だったんだ?
php7.1、7.2、7.3でエラー内容違うからなんか微細なバージョンアップがあったのかな?
というか . e
ってe修飾子でいいんかな?
/e
って感じでスラッシュつくイメージある
preg_replace()とe修飾子について
自分が理解するためのメモ
↓参考
PHP7でpreg_replaceのe修飾子の挙動が変わるので要注意です。
正規表現を使って「world」の文字列を検索して大文字に置換する記述で検証
preg_replace()
文字列を置換する関数/e
正規表現内でPHPコードを使用できるようにするらしいstrtoupper()
はアルファベットを大文字にする関数
e修飾子を使った場合
$string = "hello world";
$string2 = preg_replace('/(world)/e', "strtoupper('$1')", $string);
echo $string2;
//php5.6以下
hello WORLD
//php7~
NULL
5系はまだ動いたけど7系以降は出力されなかった
$1
は/(world)/
で引っかかった1番目を取得?するらしい1番目ってのは複数対象があった時の1番最初の要素ってことなのかな(理解不足)
e修飾子を使わなかった場合
$string = "hello world";
$string2 = preg_replace('/(world)/', "strtoupper('$1')", $string);
echo $string2;
//php5.6以下
hello strtoupper('world')
//php7~
hello strtoupper('world')
同じ出力結果になった
ここまででpreg_replace()
でマッチした文字列の小文字を大きくするstrtoupper()
を使うのにe修飾子が必要っぽいっすね
e修飾子の代わりにpreg_replace_callback()を使う
$string = "hello world";
$string2 = preg_replace_callback('/(world)/',
function($matches){
return strtoupper($matches[0]);
}, $string);
echo $string2;
//php5.6以下
hello WORLD
//php7~
hello WORLD
どっちもうまくいった
function($matches)
みたいに関数名をしていしない関数を無名関数っていうらしい
php5.3から対応
↓参考
preg_replace_callback – 正規表現検索を行い、コールバック関数を使用して置換を行う
function($matches)
の部分をcreate_function()
にしている参考サイトなんかもあったけどphp7.2から非推奨になったみたい
e修飾子はセキュリティ的によくなかったみたいね
詳しく知りたければ以下のサイトが参考になるかも
詳しく知りたければ以下のサイトが参考になるかも
正規表現がよくわからないからどこかでか調べないとだなぁ…
. e
この書き方ググっても出てこなかったから結局よくわからない以下より調べた時のメモ