Webサイト制作におけるPHPの基本(その4:エスケープシーケンス)

Webサイト制作でのPHPのコーディングにおいて、ソース中の改行を意味する「\n」(\n)などの特別な意味(役割)を持った文字とクォート(シングルorダブル)との関係は、意図した結果を得るために、しっかり理解して、使い分けられるようになっておく必要がある。

既に過去の記事で少し触れているが、エスケープシーケンスとクォートとの関係についてまとめておく。

エスケープシーケンス

ソース中の改行などの役割を持った「\n」などの「\ + 特定の文字」で1文字と扱う文字をエスケープシーケンスと呼ぶ。

以下、主なエスケープシーケンス。

エスケープシーケンス 意味(役割)、呼び方
\n 改行(ラインフィード)
\r 復帰(キャリッジリターン)
\t タブ
\$ ドル記号
\\ 「\」の文字 または バックスラッシュ
\" ダブルクォート
\' シングルクォート

これらはシングルクォート内ではただの文字列として処理されるが、ダブルクォート内ではその役割(をもったもの)として処理される。

ただし、「\\」と「\'」は例外で、「\\」についてはシングルクォート内でもその役割として処理される。「\'」については特に注意が必要。下記の表示結果参照。

以下、確認コード。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>エスケープシーケンスとクォート</title>
</head>
<body>
<?php
 print( '「\」テスト1のシングル<br>')."\n";
 print( "「\」テスト1のダブル<br>")."\n";
 print( '「\\」テスト2のシングル<br>')."\n";
 print( "「\\」テスト2のダブル<br>")."\n";
 print( '「\\\」テスト3のシングル<br>')."\n";
 print( "「\\\」テスト3のダブル<br>")."\n";
 print( '「\n」テスト4のシングル<br>')."\n";
 print( "「\n」テスト4のダブル<br>")."\n";
 print( '「\\n」テスト5のシングル<br>')."\n";
 print( "「\\n」テスト5のダブル<br>")."\n";
 print( '「\\\n」テスト6のシングル<br>')."\n";
 print( "「\\\n」テスト6のダブル<br>")."\n";
 print( '「\'」テスト7のシングル<br>')."\n";
 print( "「\'」テスト7のダブル<br>")."\n";
// print( '「\\'」テスト8のシングル<br>')."\n";   この書き方はエラーになる
 print( "「\\'」テスト8のダブル<br>")."\n";
?>
</body>
</html>

以下、表示結果。左からブラウザ表示結果、ソースコードphp(コード)の順。
←クリックで拡大表示

上記結果における「\」の役割を考えると以下の通りとなる。

  • テスト1のシングル:「\」はただの文字
  • テスト1のダブル:「\」はただの文字
  • テスト2のシングル:「\\」は役割
  • テスト2のダブル:「\\」は役割
  • テスト3のシングル:左から2つ分の「\\」は役割、3つ目の「\」はただの文字
  • テスト3のダブル:左から2つ分の「\\」は役割、3つ目の「\」はただの文字
  • テスト4のシングル:「\n」はただの文字列
  • テスト4のダブル:「\n」はソース中での改行の役割
  • テスト5のシングル:「\\」は役割、「n」はただの文字
  • テスト5のダブル:「\\」は役割、「n」はただの文字
  • テスト6のシングル:左から2つ分の「\\」は役割、「\n」はただの文字列
  • テスト6のダブル:左から2つ分の「\\」は役割、「\n」はソース中での改行の役割
  • テスト7のシングル:「\'」は役割
  • テスト7のダブル:なぜか「\'」がただの文字扱い
  • テスト8のシングル:コード作成の段階でエラー。「\\」が役割として処理され、その後の「'」がシングルクォート内のシングルクォートとして認識されるためエラーになると考えられる
  • テスト8のダブル:「\\」は役割、「'」はただの文字(シングルクォート)

結果から以下のことが分かる。

  • 「\\」の場合は、シングルクォート内でも(文字列としてではなく)役割として処理される ⇒ 余談だが、「\\\\」や「\\\\\」の場合の結果を検証した結果、左から順に「\\」を1セットとみなして処理されていくようである。
  • 「\'」の結果については、他のエスケープシーケンスとは逆で、シングルクォート内においては、役割として処理され、ダブルクォート内では文字列として処理されている(理由は不明)。

参照:エスケープシーケンスhttp://php.net/manual/ja/regexp.reference.escape.php