LoginSignup
3
1

More than 3 years have passed since last update.

PHPでバックスラッシュを含む文字列の扱い

Last updated at Posted at 2018-06-04

変数同様シングルクォートで囲えば展開されないと思っていたが、間違えていた。

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になった)

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1