お問い合わせフォームで会社名などに「&(アンパサンド)」が含まれている場合、自動返信メールや管理者宛メールに「&」と表示されてしまうケースがあります。
例えば、「A&B株式会社」という会社名の方がフォーム送信をした際、自動返信メールで「A&B株式会社」と表示されてしまうと、違和感を感じてしまうと思います。
これは一体なぜ起こるのでしょうか?
今回はその原因と、正しく表示させるための方法をご紹介します。
なぜ「&」が「&」と表示されるのか?
このような現象が起きるのは、「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;
このようにすることで、「A&B株式会社」とメールに表示されていた文字列が、本来の「A&B株式会社」として表示されるようになります。
注意点
htmlspecialchars_decode()
を使う場面は、メール本文のように人が読むことを想定した出力のときに限るようにしましょう。- 逆に、HTML画面上に出力する場合は、セキュリティの観点から
htmlspecialchars()
を使用して、エンティティ化することが基本です。 - 万が一、フォームの入力内容をそのままHTMLに表示するとXSS(クロスサイトスクリプティング)などのリスクがあるため、使い分けが重要です。
まとめ
フォームに入力された「&」が「&」と表示されるのは、HTMLエンティティによる変換が原因です。
人間が読むメールなどに表示する際には、htmlspecialchars_decode()
を使うことで、元の文字に戻すことができます。
正しく理解してフォーム処理を行えば、表示の違和感も起きません。
フォーム処理の中で、出力先に応じた適切な変換を意識できると上級者と言えるでしょう。