preg_replaceで”(ダブルクォーテーション)と’(シングルクォーテーション)の違いでハマったこと

WEBアプリの開発で設定の読み書きをDBではなくファイルでやっちゃおうということで、file_get_contentsで読み込んだファイルの一部を正規表現で書き換えて上書きしちゃうーってプログラムをサクッと書いてテストしてみたが全然文字列を置き換えてくれない。

結論から言うと、パターン文字列の中に”$”とかが入ってる場合にはその文字自体のエスケープ(¥)ももちろんだけど、パターンを囲む区切りにはダブルクォーテーションを使っちゃダメーってことでした。

要はパターンの中の$をテキストエディタなどの正規表現での検索ではちゃんと認識されても、PHP側が変数として展開してしまうために誤認識されるようでヘ(´o`)ヘ 
こんなしょーもない知識不足のせいで、何十分もあーでもない、こーでもないーとハマってしまったのです。

ファイルは概ね下記のような感じで、単純に変数名($●●) = 値;みたいなのが複数行詰まってるだけのテキストファイルで、与えられた値によってそれらの行の文字列を置換して値更新しようとするってことだけ。

//項目1
$key1="100";
//項目2
$key2="200";

 ファイルを読み込んで置換したい行の値を更新するためのPHPとして下記のようなコードを用意した。

$content = file_get_contents("./file.txt")//データファイルを読み込む

$ptn="$key1=d{1,3}/"; //項目1の行の先頭から読み込んで、値を置換するためのパターン(3ケタまでの数字)
$rep="$key1=200";//変更後の値

$content = preg_replace($ptn,$rep,$content);

 2行目のパターンは”(ダブルクォーテーション)で囲んじゃってます。
これだと先頭の$はバックスラッシュでエスケープしてるものの、実際には変数として認識されちゃってるんでしょうね。

これを

$content = file_get_contents("./file.txt")//データファイルを読み込む

$ptn='$key1=d{1,3}/'; //シングルクォーテーションで囲みなおした
$rep='$key1=200';//変更後の値(こっちもシングルに)

$content = preg_replace($ptn,$rep,$content);

 と修正するだけで、あら、なんということでしょう…ちゃんと対象文字列を認識して置換してくれました。
ちゃんちゃん!

こんなつまらないミスしないように備忘録。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA