バックスラッシュの罠

<?php
$string = 'aaa\bbb';
$pattern = '' ;
$replacement = '' ;

echo preg_replace($pattern, $replacement, $string);

の結果を、

aaa\\bbb

としたい場合の$pattern,$replacementの答え

<?php
$string = 'aaa\bbb';
$pattern = '/\\\\/';
$replacement = '\\\\\\\\';

echo preg_replace($pattern, $replacement, $string);

一旦、

$pattern = '/\\\\/';
$replacement = '\\\\\\\\';

が文字列リテラルとして評価された際に

'/\\/'
'\\\\'

となって、再度preg_replace()で評価される際に

'/\/'
'\\'

となると言う事で、PHP正規表現に於いて「\」一つに対応するパターンは「\\\\」となる・・・


なんと言うバッドノウハウ


PHP: PCRE 正規表現構文 - Manual