こんにちは! 独学プログラマー&ライターのつぶらやです。
PHPの勉強をして実際に開発を進めていくと、以下のような事にぶつかる事があります。
- 文字として認識されない文字がある
- htmlタグの中で「 ” 」が認識されずに正しく出力されない
今回は、上記の問題を解決するための解説をしていきます。キーワードはエスケープです。
それでは進めていきましょう。
エスケープってなに?
エスケープを行うと「キーボードから入力できない文字を出力させる」「解釈が違う文字の効果を打ち消す」などの効果があります。ちょっと難しいですね。わかりやすく説明して行きます。
エスケープが必要な理由
PHPコード内でhtmlタグや改行などを記述する際にエスケープをしていないと、ブラウザで正しく表示されません。それどころかエラーが発生して処理が止まってしまう場合もあります。
例をあげて解説していきます。
文字として認識されない文字がある場合
echo '<
class=’title_class’>なんでも日記</h2>’;
タイトルを表示しようとして上記のようなコードを書いたとします。
ブラウザ表示結果 HTTP ERROR 500
エラーログ PHP Parse error: syntax error, unexpected 'title_class' (T_STRING), expecting ',' or ';' in ...略
ブラウザは表示されませんし、エラーログに文法エラーが出て処理が止まってしまいました。「’」(シングルクォーテーション)で囲まれた文字列の中に、更に「’」(シングルクォーテーション)で囲まれた文字列が存在しているからです。
こんな場合は、以下のようにします。
echo '<
class=’title_class’>なんでも日記</h2>’;
ブラウザ表示結果 なんでも日記
このように「」を「’」の前につける事でブラウザに表示する事が出来ました。
これがエスケープ処理です。
PHPコード内で出力文字列を改行する場合
では、改行する場合はどうでしょうか。
通常キーボードのキーを押すと押したキーに対応した文字が入力されますが、改行であるEnterキーは何も表示されずに改行がされるだけです。
PHPの中ではどのようになるでしょうか。試してみましょう。
echo "なんでも 日記";
※なんでもの後改行キーを押しています。
ブラウザのソースコード結果 なんでも日記
因みに結果確認をしているのはブラウザのソースコードです。PHPで生成されるhtmlに対して改行されます。
ブラウザはhtmlタグの<br />でしか改行されません。
それではここでまたエスケープの出番です。
echo "なんでもn日記";
ブラウザのソースコード結果 なんでも 日記
改行できました! でも、あれ? 「」はエスケープで使うとお話しましたが、nってなんでしょうか。
それは次の項目でお話しします。
バックスラッシュ「\」でエスケープする方法
「\」エスケープする記述方法をエスケープシーケンスと呼びます。前項で使用した¥’や¥nも実はエスケープシーケンスの一種です。
以下に代表的なエスケープシーケンスを記載します。
[su_table]
種類説明 | エスケープシーケンス |
改行 | ¥n |
左括弧 | ¥( |
右括弧 | ¥) |
左角括弧 | ¥[ |
右角括弧 | ¥] |
シングルクォーテーション | ¥’ |
ダブルクォーテーション | ¥” |
円文字 | ¥¥ |
ドル文字 | ¥$ |
[/su_table]
よく使う記号ばかりなので覚えておいて損はありません。
ただしエスケープシーケンスはクォーテーションで囲まれていないと効果がありません。
シングルクォーテーションで囲むと、エスケープシーケンスも一緒に文字列として認識されますので注意してください。
PHPのエスケープ関連の関数
最後に簡単にエスケープする方法として、2つの関数を紹介します。
addslashes関数
以下のサンプルを見てください。
$escape_test = "escape'PHP'"; // 変数にエスケープしたい文字列を代入 echo addslashes($escape_test); // addslashes関数に変数を渡して、結果を表示させる
結果 escape'PHP'
addslashes関数はシングルクォーテーションなどのエスケープシーケンスに含まれる文字や記号を自動的にエスケープしてくれる関数です。サンプル例では、シングルクォーテーションがエスケープされているのがわかりますね。
var_export関数
var_export関数もaddslashes関数と同じように使用できます。
先ほどのサンプルに当てはめてみましょう。
$escape_test = "escape'PHP'"; echo var_export($escape_test);
結果 'escape'PHP''
結果がaddslashes関数と少し違いますね。
文字列として出力されるためダブルクォーテーションがシングルクォーテーションに置き換わります。この点がaddslashes関数と違う点ですが、エスケープは同じようにされています。
まとめ
今回はPHPのエスケープについてお話しました。
文字やタグを表示させる時には注意してください。うまく表示されない場合やシンタックスエラー(文法エラー)が出た場合には、エスケープが必要な文字を使用していないか疑ってみると解決する場合もあるかもしれません。
それでは、また。