[PHP] preg_replace 後方参照でちょっと悩んだ 
2012/09/20 Thu.
強力な正規表現が使えるPHPの関数「preg_replace」で、後方参照を使おうとしたらちょっと悩んだのでメモ。
後方参照とは正規表現の機能の一つで、括弧「()」で括った内容が一時的にバッファに記憶され、その内容を後で使えるというもの。
置換処理でよく使います。
たとえば、
何らかの文字列-500 を 何らかの文字列-800 に変換したい場合、
preg_replace("/(何らかの文字列にマッチする正規表現)-500/", "$1-800", 文字列);
このように、「何らかの文字列にマッチする正規表現」を「()」で括り、replacement部に「$1」としてやると、$1の部分に()で括った内容が入るわけです。
「()」の数を増やせば、$1,$2,$3・・・と使えます。
で、今回悩んだのは、「$1」の直後に数字が来る場合です。
何らかの文字列500 を 何らかの文字列800 の場合、先ほどは間に「-」がありましたが今回は直後に数字が来ます。つまり、
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "$1800", 文字列);
こうなる。
でも、これでは「$1」なのか「$18」なのかわかりません。
で、PHPマニュアルを見ると「\${1}」としなさいと書いている。
なるほど。
PHPなので、「{$1}」とやりがちだけどそれは間違い。
それと、ちょっと注意なのは、replacement部の括りがダブルクォーテーションなのかシングルクォーテーションなのかで「\」の有無が変わってくる。
おさらい。
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "\${1}800", 文字列);
preg_replace("/(何らかの文字列にマッチする正規表現)500/", '${1}800', 文字列);
です。
違いは良く見てね。
なお、直後が数字でない場合はダブルクォーテーションの場合でも「\」はいらない。
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "$1EightHundred", 文字列);
後方参照とは正規表現の機能の一つで、括弧「()」で括った内容が一時的にバッファに記憶され、その内容を後で使えるというもの。
置換処理でよく使います。
たとえば、
何らかの文字列-500 を 何らかの文字列-800 に変換したい場合、
preg_replace("/(何らかの文字列にマッチする正規表現)-500/", "$1-800", 文字列);
このように、「何らかの文字列にマッチする正規表現」を「()」で括り、replacement部に「$1」としてやると、$1の部分に()で括った内容が入るわけです。
「()」の数を増やせば、$1,$2,$3・・・と使えます。
で、今回悩んだのは、「$1」の直後に数字が来る場合です。
何らかの文字列500 を 何らかの文字列800 の場合、先ほどは間に「-」がありましたが今回は直後に数字が来ます。つまり、
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "$1800", 文字列);
こうなる。
でも、これでは「$1」なのか「$18」なのかわかりません。
で、PHPマニュアルを見ると「\${1}」としなさいと書いている。
なるほど。
PHPなので、「{$1}」とやりがちだけどそれは間違い。
それと、ちょっと注意なのは、replacement部の括りがダブルクォーテーションなのかシングルクォーテーションなのかで「\」の有無が変わってくる。
おさらい。
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "\${1}800", 文字列);
preg_replace("/(何らかの文字列にマッチする正規表現)500/", '${1}800', 文字列);
です。
違いは良く見てね。
なお、直後が数字でない場合はダブルクォーテーションの場合でも「\」はいらない。
preg_replace("/(何らかの文字列にマッチする正規表現)500/", "$1EightHundred", 文字列);
- 関連記事
category: PHP
この記事へのコメント
コメントの投稿
コメントは全て管理人が内容を確認してから表示されます(非公開コメント除く)。
内容によっては表示されない場合がありますことご了承願います。
内容によっては表示されない場合がありますことご了承願います。