PHPのエスケープ処理について現役エンジニアが解説【初心者向け】
初心者向けにPHPのエスケープ処理について現役エンジニアが解説しています。エスケープ処理とは、出力することの出来ない文字を出力させたり、文字列の途中で改行するなどの特殊な出力を行うための処理です。文字列やダブルクォーテーションをバックスラッシュでエスケープします。また、エスケープ処理には表示される文字列に含まれるHTMLタグやJavaScriptコードを命令として認識されない無害な文字列に変換する処理もあります。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名 調査手法:インターネット調査
監修してくれたメンター
井上 祐介
PHPのエスケープ処理について、テックアカデミーのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。
目次
そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。
PHPでダブルクォーテーションを表示しようとしたらエラーがでます。どうしたらいいですか?
ソースコード:
<?php
echo "私は"りんご"が好きです";
?>
エラー画面:
PHP Parse error: syntax error, unexpected identifier "りんご", expecting "," or ";" in /workspace/Main.php on line 2
PHPでのダブルクォーテーションは「文字列の始まりや終了」を表す特別な意味がある記号だから、そのままでは表示できないんだ。
ダブルクォーテーションのような、特別な記号の働きをなくすエスケープ処理が必要だね。
エスケープ?何の処理ですか?
エスケープ処理をすると機能を無効にしたり、違う機能をさせたりできるんだ。
「エスケープ」の英語には「脱出する」という意味があるから、本来の機能から「脱出」させるのがエスケープ処理と覚えるのもいいね。
そういえば、スマホのゲームに「エスケープ」ってタイトルが付いたゲームがありましたけど脱出ゲームでしたね。
プログラミング言語でのエスケープ処理には特殊記号を表示することと、HTMLタグなどの命令を無効にする2つの役割があるんだよ。
そうなんですね。その「エスケープ処理」について教えてください!
じゃあ、特殊記号を表示させる方法から見ていこうか。
この記事は、エスケープ処理の概要や、PHPプログラムでエスケープ処理を行う方法について解説しています。PHPを使用した開発にまだ慣れていないという方でも、理解できる内容になっています。
エスケープ処理とは
エスケープ処理とは、特殊記号(あるいはタグなどの命令)で行われる処理を回避して単なる文字として表示したり、逆に普通の文字に改行などの特別な機能を持たせます。
たとえば、「”」(ダブルクォーテーション)をPHPのコードから文字列として表示させたい場合、通常なら「”」は文字列の始まりか終わりを指す特殊記号なのでPHPでは表示ができません。
特殊記号を表示するには、バックスラッシュ(\)または円記号に続けて特殊記号を記述します。
バックスラッシュのようなエスケープ処理に使う文字をエスケープ文字といいます。
エスケープ処理には特殊記号を表示させるだけでなく、HTMLコードやJavaScriptの命令を無効化して安全に表示する使い方もあります。
このようなエスケープ処理はPHPに限らず、他のプログラム言語でも共通に存在する処理です。
※バックスラッシュ(\)を入力しても円記号(¥)がそのまま表示される場合もありますが、PHPでは円記号はバックスラッシュと同じ役割です。
※ダブルクォーテーションをWebページ上に表示するには、HTMLの特殊文字コード「"」を使う方法もあります。
バックスラッシュの入力方法について
Windowsで標準的なキーボード配列の場合、バックスラッシュ(\)は日本語キーボードだとバックスペースキーの左側のキー(キーボードの刻印は「¥」)を押すか、右下にある「\」キー(日本語かな表記だと「ろ」の刻印のキー)を押します。
※Windowsでは使用しているアプリやフォント(書体)により、バックスラッシュが円記号で表示される場合があります。
※バックスラッシュの入力はPHPの命令と同じように漢字入力オフ(漢字が入力できない状態)で入力してください。
※URLで使われるスラッシュ(/)と、エスケープ文字のバックスラッシュ(\)は違う記号なので注意してください。
またMacの場合だと、「option」キーを押しながら右上の「¥」キーを押すだけで、半角のバックスラッシュが入力できます。
【参考】文字列の囲み方
PHPで文字列を囲むには、(“)ダブルクォーテーションで囲む方法と(‘)シングルクォーテーションで囲む方法があります。
(“)ダブルクォーテーションを文字列の中で使用する場合、(‘)シングルクォーテーションで囲んで「’私は”りんご”が好きです’」のように指定します。
違う記号で囲む方法は、コードの中で文字列を囲む記号が統一できないので、エスケープ処理をするのがおすすめです。
特殊記号を表示する
PHPでダブルクォーテーションを含んだ文字列をバックスラッシュでエスケープして表示します。
サンプルコード
ダブルクォーテーションを含んだ「私は”りんご”が好きです」という文章を表示します。
ソースコード
<?php
echo "私は\"りんご\"が好きです";
?>
実行結果
解説
上記のプログラムでは、「”」の前にバックスラッシュ(\)を使用して「”」を単に文字として扱うようにしています。
このようにダブルクォーテーションのような特別な意味を持つ文字の前に「\」のエスケープ文字を使用して「文字列の開始と終了」という特別な効果を打ち消す処理がエスケープ処理です。
エスケープシーケンス
上記のように、特殊な記号を文字として出力するためにエスケープ文字を使用した文字の組み合わせをエスケープシーケンスといいます。
エスケープシーケンスを使用することで、文字列の途中で「改行」したり「タブ」を挿入したりといった特殊な処理を行うことも可能です。
エスケープシーケンスを有効にするにはダブルクォーテーションで文字列を囲みます。
以下は、主なエスケープシーケンスの一覧です。
\n | 改行 |
\’ | シングルクォーテーション(‘) |
\” | ダブルクォーテーション(“) |
\¥ | 円記号 |
\$ | ドル記号 |
\t | 水平タブ |
\\ | バックスラッシュ |
※PHPの他のエスケープシーケンスについて、詳しくは公式のドキュメント「エスケープシーケンス」をご覧ください。
※エスケープシーケンスが含まれた文字列をシングルクォーテーションで囲むと、「\’」「\\」以外のエスケープシーケンスは機能せずエスケープ文字が表示されてしまいます。
エスケープシーケンスを使った例
それでは、実際にエスケープシーケンスを使用する例を見ていきましょう。
サンプルコード
エスケープシーケンスを使った例として、以下の記号の表示をしてみましょう。
- (‘)シングルクォーテーション
- 改行
- タブ
- ドル記号
- バックスラッシュ
ソースコード
//preタグで通常のテキストとして表示
echo "<pre>";
// ダブルクォーテーションの表示
echo 'PHPの文字列は「"」か「\'」で囲みます。';
// 改行
echo "\n";
echo "\nりんご\nみかん\nれもん\n";
echo "\n";
// タブ
echo "1\t2\t3\n";
echo "りんご\tみかん\tれもん\n";
echo "\n";
// ドル記号
echo "りんごの価格:\$1\n";
echo "\n";
//バックスラッシュ
echo "PHPで改行するには「\\n」と記述します";
//preタグの終わり
echo "</pre>";
実行結果
解説
2行目のpreタグは出力した改行などをHTML表示でも反映させるためのタグです。
5行目では文字列をシングルクォーテーションで囲っているのでダブルクォーテーション(“)はそのまま表示でき、シングルクォーテーションはエスケープシーケンスで表示します。
8から10行目でエスケープシーケンス「\n」により文字列の途中で改行しています。
13と14行目は文字をそろえる時に便利なタブ文字「\t」(一定間隔の空白を空ける文字)を入力しているので、数字とフルーツの名前がそろっています。
18行目は変数名などで使われるドル記号($)をエスケープして表示しています。
また22行目にあるように、バックスラッシュ(または円記号)自身を表示するときは「\\」と記述します。
※シングルクォーテーションで文字列を囲ったときに機能するエスケープシーケンスは、「\’」と「\\」だけです。
[PR] PHPを学んで未経験からWebエンジニアを目指す方法とは
HTMLタグのエスケープ(htmlspecialchars)
エスケープ処理の中にはHTMLタグを無効化する処理も含まれます。
たとえば、エスケープ処理をしていないフォームに「<script>alert(‘Hello!’)</scprit>」と入力すると、入力された文字を表示するときにアラート画面を表示するJavaScriptがそのまま実行されてしまう可能性があります。
エスケープ処理を行うとタグで使われるHTMLの命令であるHTMLエンティティに変換されるので「<」や「>」などの記号は単なる文字として表示する「<」「>」に変わります。
PHPでHTMLタグをエスケープ処理するにはhtmlspecialchars関数を使います。
※HTMLエンティティとは、アンパサンド(&)で始まりセミコロン(;)で終わる記号を表示するHTMLの命令を表す文字です。たとえばコピーライトの記号「©」を表示させるHTMLエンティティは「©」です。
※エスケープ処理する関数は、他に特殊記号なども変換できるhtmlentities関数やタグを取り除くstrip_tags関数などもあります。
書式
エスケープ処理された文字 = htmlspecialchars( 対象文字列 );
htmlspecialchars関数の第1引数には、エスケープ処理したい文字列を指定します。
※第2引数は省略できますが、ダブルクォーテーションなどを変換するかどうかなどの変換パターンを指定します。詳しくは公式ドキュメント「PHP: htmlspecialchars – Manual」のパラメータflagsの項目をご覧ください。
※第3引数も省略できて、文字を変換するときの文字コードを指定します。
サンプルコード
HTMLタグを含んだ文字列「<b>太字</b><br>」をhtmlspecialchars関数でエスケープ処理して、HTMLタグとして認識されない文字(HTMLエンティティ)に変換します。
ソースコード
<?php
//HTMLタグをそのまま表示(太字になる)
$tag = "<b>太字</b><br>";
echo $tag;
//HTMLタグをエスケープして表示(HTMLエンティティに変換される)
$tag_escape = htmlspecialchars($tag);
echo $tag_escape;
?>
実行結果
解説
変数 $tagを表示すると、HTMLタグが有効なので<b>タグが有効になり太字で表示され<br>タグで改行されます。
htmlspecialchars関数にエスケープ処理したい変数 $tagを渡します。
エスケープ処理されて「<」「>」の記号がHTMLエンティティに変換され、変数 $tagの文字列は「<b>太字</b><br>」になります。
エスケープ処理された変数 $tag_escapeを表示するとHTMLエンティティに変換されているので、太字にも改行にもならず単なる文字として表示されます。
まとめ
バックスラッシュ(\)に続けて記述されたエスケープシーケンスを使用することで、特別な効果を持つ「’」や「$」を文字として出力したり、改行やタブのような特殊な処理を行えます。
HTMLタグを無効にするhtmlspecialchars関数でエスケープ処理することで安全な表示が行えます。
エスケープ処理は実務でもよく使いますし、PHP以外のプログラム言語でも使用する処理です。
エスケープ処理とは何か、その使用方法について確実にマスターして実際の開発に役立てましょう。
内容が分かりやすくて良かったです!
ゆかりちゃんも分からないことがあったら質問してね!
分かりました。ありがとうございます!
PHPを学習中の方へ
これで解説は終了です、お疲れさまでした。
- つまずかず「効率的に」学びたい
- 副業や転職後の「現場で使える」知識やスキルを身につけたい
プログラミングを学習していて、このように思ったことはありませんか?
テックアカデミーのPHP/Laravelコースでは、第一線で活躍する「プロのエンジニア」が教えているので、効率的に実践的なスキルを完全オンラインでしっかり習得できます。
合格率10%の選考を通過した、選ばれたエンジニアの手厚いサポートを受けながら、PHP/Laravelを使ったWebアプリケーション開発を学べます。
まずは一度、無料体験で学習の悩みや今後のキャリアについて話してみて、「現役エンジニアから教わること」を実感してみてください。
時間がない方、深く知ってから体験してみたい方は、今スグ見られる説明動画から先に視聴することをおすすめします!