お問い合わせフォームで会社名などに「&(アンパサンド)」が含まれている場合、自動返信メールや管理者宛メールに「&」と表示されてしまうケースがあります。
例えば、「A&B株式会社」という会社名の方がフォームで会社名を入力して送信した場合、自動返信メールや管理者宛メールの会社名の項目で「A&B株式会社」と表示されてしまいます。
この現象は一体なぜ起こるのでしょうか?
今回はその原因と、正しく表示させるための方法についてご紹介します。
なぜ「&」が「&」と表示されるのか?
「&」が「&」と表示される現象が起きるのは、「HTMLエンティティ」による自動変換が原因です。
「&」や「<」といった記号は、HTMLの中で特別な意味を持つため、そのまま使うと誤解されてしまう恐れがあります。
そのため、フォームから送信されたデータに含まれる特殊文字は、自動的に「HTMLエンティティ」と呼ばれる形式に変換されます。
&
→&
<
→<
"
→"
この変換はHTMLを正しく表示させるためには必要な処理なのですが、メール文面など人が読むコンテンツにそのまま表示されると、意図しない見た目になってしまうのです。
HTMLエンティティとは?
HTMLエンティティとは、HTML上で特殊な意味を持つ文字を正しく扱うための「文字コード表記」のことです。
基本的には「アンパサンド(&)」から始まり、「セミコロン(;)」で終わります。
例えば以下をご覧ください。左がHTMLエンティティで、右が元の文字です。
&
→&
<
→<
"
→"
これらのHTMLエンティティはHTML内で記述すると、実際の画面上には元の文字が表示されます。
しかし、テキストメールに表示するための変数にHTMLエンティティがそのまま使われると、元の文字に変換されず、HTMLエンティティのまま表示されてしまいます。
HTMLエンティティを元の文字に戻すには?
では、表示された「&」を元の「&」に戻すにはどうすればよいのでしょうか。
PHPでフォームを受け取る処理をしている場合、htmlspecialchars_decode()
関数を使うことで、HTMLエンティティを元の文字に戻すことができます。
例:会社名の入力
// HTMLエンティティを適切な文字に変換
$corpname = htmlspecialchars_decode($_POST["corpname"], ENT_QUOTES);
echo $corpname;
上記コードのように記述することで、入力項目に特殊文字が含まれている場合に変換されたHTMLエンティティを、元の文字に戻すことができます。
- 会社名の入力で「A&B株式会社」と入力・送信される。
- 特殊文字「&」がHTMLエンティティに変換され、「A&B株式会社」が変数に入る。
- 「A&B株式会社」の「&」を「&」に変換して出力する。
以上の流れにより、「A&B株式会社」とメールに表示されていた文字列が、本来の「A&B株式会社」として表示されるようになります。
注意点
htmlspecialchars_decode()
を使う場面は、メール本文のように人が読むことを想定した出力のときに限るようにしましょう。- 逆に、HTML画面上に出力する場合は、
htmlspecialchars()
を使用して、エンティティ化することが基本です。
まとめ
フォームに入力された「&」が「&」と表示されるのは、HTMLエンティティによる変換が原因です。
人間が読むメールなどに表示する際には、htmlspecialchars_decode()
を使うことで、元の文字に戻すことができます。
特殊文字が入力されることも想定してフォーム実装を行うと上級者と言えるでしょう。