変数同様シングルクォートで囲えば展開されないと思っていたが、間違えていた。
var_dump("\n");// string(1) "
"
var_dump('\n');// string(2) "\n"
var_dump('\あ');// string(4) "\あ"
var_dump('\\あ');// string(4) "\あ"
var_dump('\\');// string(1) "\"
var_dump('\\\\');// string(2) "\\"
var_dump('\');// syntax error
var_dump('\\\');// syntax error
バックスラッシュ2つでバックスラッシュ1つになる様子
- バックスラッシュ含むJSONを扱う例
$str1 = '[{"pattern":"\\s*","replacement":""}]';
$str2 = '[{"pattern":"\\\s*","replacement":""}]';
$str1は{"pattern":"\s*","replacement":""}
なのでエラー
var_dump(json_decode($str1));// NULL
var_dump(json_last_error_msg());// string(12) "Syntax error"
$str2は{"pattern":"\\s*","replacement":""}
なので成功
var_dump(json_decode($str2));
/*
array(1) {
[0]=>
object(stdClass)#1 (2) {
["pattern"]=>
string(3) "\s*"
["replacement"]=>
string(0) ""
}
}
*/
input等の入力欄での扱い
バックスラッシュを3つ入れれば良いのかと思い
input等の入力欄に[{"pattern":"\\\s*","replacement":""}]
を入れるとパースエラー
入力値のバックスラッシュは適切に処理されるので
ダンプをとると"[{"pattern":"\\\s*","result":""}]"
ダンプで3つ出てパースエラーということは\\\\\s
のように変換されている
よって入力値は素直にJSON本来の形式で良い
ソースコード上では
'[{"pattern":"\\\s*","result":""}]'
-
input等の入力欄で
'[{"pattern":"\\s*","result":""}]'
(
$input === '[{"pattern":"\\\s*","result":""}]'
はtrueになった)