🌊

【PHP 】preg_match, preg_replace の実行結果がnullや0で戻ってくる

2022/08/20に公開

課題直面

画像をアップロードする際の処理をbase64で行なっていた際、preg_replace の文字列置換で NULL しか帰らず、詰まったので記述します。

手順(ご参考までに)
1) 画像をbase64の状態でバックエンドに渡す
2) 文字列置換(preg_match)でbase64の部分を省く

$uploadImage = preg_replace('/^data:image.*base64,/', '', $imageBase64); <= ここで NULL が帰ってくる (T T)
$uploadImage = str_replace(' ', '+', $img);

3) base64をdecodeしてファイルデータに戻す

$fileData = base64_decode($uploadImage);

原因と解決策

1)原因

php.iniのコンパイラ設定がfalseになっていたことが原因でした。
php.iniの文字数制限設定が少ない、コンパイラ設定がfalseになっているなどの制限に引っかかった時にはマッチングをあきらめて、結果として preg_match であれば 0、preg_replace であれば null が返ってくるそうです。

2)解決策

php.iniを開いて、以下修正する
pcre.jit=1

その他、preg系に関連するphp.iniの設定箇所

pcre.backtrack_limit :PCRE のバックトラック処理の制限値。
pcre.recursion_limit :PCRE の再帰処理の制限値。
pcre.jit             :PCRE の just-in-time コンパイルを利用するかどうか。

3)参考URL

公式サイト php.ini デフォルト値
https://www.php.net/manual/ja/pcre.configuration.php
ブログ pcre 設定
https://memo.koumei2.com/php-pcre/
preg_last_errorでロギングできるっぽい
https://www.php.net/manual/ja/function.preg-last-error-msg.php

php.ini触り方

1)php.iniのファイルを探す

  1. public配下に phpinfo.php ファイルを作成 (ファイル名はなんでもいい)
  2. 以下内容を記述
  <?php phpinfo();
  1. /phpinfo.php にアクセス
  2. php.iniファイルが開かれるので、「Loaded Configuration File」の項目を確認
    「php.ini」 ファイルがある階層が記載されてる

2) php.iniファイルを開く

sudo vi <調べた階層>

3) 検索方法(php.iniファイルめちゃくちゃ長いので)

  1. /(スラッシュ)を入力
  2. 検索文字列を入力
  3. Enterを押すと検索に一致した文字まで遷移する
  4. 次の検索結果に行くには「N」を押す

4) php.iniの変更内容を反映させる

再起動:sudo systemctl restart php-fpm

Discussion