エスケープシーケンスを置き換えたるため以下のように書きました。
testesc の $char に\に続く一文字だけ該当するように想定していますが
何故か \"のときだけ " ではなく \" 2文字が引数に渡されてしまいます。
これはどこに問題があるのか教えてください。

<?php
$in = '\\\\abc\tdef\\"';
$out = preg_replace('/\\\\(.)/e', "testesc('$1')", $in);
echo 'input [' . $in ."]\n";
echo 'output [' . $out ."]\n";
function testesc($char){
    if($char=='"'){
        return '"';
    }elseif($char=='\\"'){
        return '?';
    }elseif($char=='\\'){
        return '\\';
    }elseif($char=='t'){
        return "\t";
    }else{
        return '';
    }
}
?>
実行結果
input [\\abc\tdef\"]
output [\abc def?]