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