MW211 EXIT

devlog
PHP/「\」を「\\」に置換する方法
2012年04月07日
「\」(バックスラッシュ)は、PHPとしても、正規表現としても特殊な意味をもつので
その取扱いがややこしい。

結論からいうと、「preg_replace()」を使った場合、以下のような感じだ。
┌──────────────────────────────────────┐
│$置換後 = preg_replace('/\\\\/', '\\\\\\\\', $置換前);                      │
└──────────────────────────────────────┘

┌──────────────────────────────────────┐
│(1) PHPとして、「'」で囲われた文字中の「\\」は「\」になる                   │
├──────────────────────────────────────┤
│(2) 正規表現として、文字としての「\」を表すのは「\\」(※)                   │
│    ※検索文字だけでなく置換後文字についても該当するので注意                │
└──────────────────────────────────────┘
よって「\」数の「1→2」を行いたい場合「1×4→2×4」=「4→8」となる。

ただ、(1)の原則は時に忘れられがちなので注意が必要だ。

例えば次の二つは同じ意味になるから、たいていは(a)を使う。
┌──────────────────────────────────────┐
│(a) $置換後 = preg_replace('/\d/', '_', $置換前);                           │
├──────────────────────────────────────┤
│(b) $置換後 = preg_replace('/\\d/', '_', $置換前);                          │
└──────────────────────────────────────┘

さきほどの(1)を補足するならば、以下のような感じだろうか。
┌──────────────────────────────────────┐
│(1) PHPとして、「'」で囲われた文字中の「\\」は「\」になる                   │
│    (が、端数の「\」は「\」になる)                                          │
└──────────────────────────────────────┘
#「\」の後続に続く文字によって挙動が変わるという言い方もある

結局のところ「\」自身を使う場面でなければ(1)の原則はあまり意識されない。
日頃から原則に従って(b)を使うように徹底すれば、なんてことはないのだが
突然「\」を使う段になって、(1)のような話に出くわすと結構焦る。
(a)もすべて(b)に置換しなきゃダメなのかという恐怖感に襲われたりして。

なので、(b)を徹底しないまでも(徹底する必要もないのかもしれないが)、
この考え方はしっかり覚えておくべきだろう。
分類:PHP