[PHP] 文字列リテラルにおけるエスケープ記号「\」の扱い

基本

  • エスケープ記号「\」(バックスラッシュ、円記号)をエスケープする、つまり\を文字として表示するには「\\」と書く。
  • 単独の\(エスケープされていない\)につづく文字とセットで改行(\n)などの特殊文字になる場合以外は、「\\」とされていなくてもそのまま文字として扱われる。
/* シングルクオーテーション */
echo '\\';		// \
echo '\\a';		// \a
echo '\a';		// \a
echo '\'';		// '
echo '\\\'';	// \'
echo '\\\a';	// \\a
echo '\\\\a';	// \\a

/* ダブルクオーテーション */
echo "\\\$";	// \$
echo "\"";		// "

エスケープされる文字

シングルクオーテーション(引用符)

シングルクオーテーション「’」をエスケープするときのみ使用。

ダブルクオーテーション(二重引用符)

以下の組み合わせのみ。

記述 意味
\n ラインフィード(LFまたはアスキーの0x0A (10))
\r キャリッジリターン (CRまたはアスキーの0x0D (13))
\t 水平タブ(HTまたはアスキーの0x09 (9))
\\ バックスラッシュ
\$ ドル記号
\" 2重引用符
\[0-7]{1,3} 正規表現にマッチする文字シーケンスは、8進数表記の1文字です。
\x[0-9A-Fa-f]{1,2} 正規表現にマッチする文字シーケンスは、16進数表記の1文字です。

Nowdoc

なし。

ヒアドキュメント

ダブルクオーテーションと同じだが、「"」をエスケープする必要はない。

正規表現の場合

Javaと同じく文字列リテラルとして正規表現の構文を書くしかないので、たとえば「/\t/」という正規表現の場合、文字列リテラルとしては「’/\\t/’」と書かなければならない。

よって、正規表現として「\」をエスケープした「/\\/」(バックスラッシュ/円記号そのもの)の場合は、「’\\\\’」とする。

可読性が低いが、JavaScriptやActionScript 3.0のような正規表現リテラルが用意されていないのでどうしようもない。

まとめ

エスケープ記号につづく文字とセットで特殊文字になるか否かで動作が変わるというのは、かえってわかりづらい。

「\\\a」と「\\\\a」が同じになるというのは、あまりに直感的でない。

可読性を高めるためにも、「エスケープ記号を文字として扱う場合は、かならずエスケープする(\\)」とこころがけたほうがいいだろう。

PHP

Posted by takasho