web関連

【php】/e修飾子がphp7.3に対応していなかった時の備忘録

【php】/e修飾子がphp7.3に対応していなかった時の備忘録

とあるフリーのフォームを使っていたら送信できなくなったので調べた時のメモ

実際にあったコード

/e修飾子とかいうのが原因だった
php7以降は消したら治った

https://3v4l.org/uE42a(リンク先にコード)

. eの部分消した正常に動くようになったんだけど何だったんだ?
php7.1、7.2、7.3でエラー内容違うからなんか微細なバージョンアップがあったのかな?

というか . eって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修飾子はセキュリティ的によくなかったみたいね
詳しく知りたければ以下のサイトが参考になるかも

php – 誰かが/ e正規表現修飾子を説明できますか?

正規表現がよくわからないからどこかでか調べないとだなぁ…

Leave a Comment

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。