関数・クラス解説

htmlspecialchars

version:PHP 4, PHP 5, PHP 7 (公式)

特殊な文字をHTMLエンティティに変換する

フォーマット

string : htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = TRUE ]]] )

パラメータ

string $string
変換される文字列

int $flags = ENT_COMPAT | ENT_HTML401
変換する特殊文字とドキュメント形式の組み合わせを指定する。利用可能な定数は以下を参照してください。


利用可能な flags 定数
定数名説明
ENT_COMPATダブルクオートは変換しますがシングルクオートは変換しません。
ENT_QUOTESシングルクオートとダブルクオートを共に変換します。
ENT_NOQUOTESシングルクオートとダブルクオートは共に変換されません。
ENT_IGNORE無効な符号単位シーケンスを含む文字列を渡したときに、空の文字列を返すのではなく無効な部分を切り捨てるようになります。このフラグは使わないようにしましょう。セキュリティの問題が発生する可能性があります。
ENT_SUBSTITUTE無効な符号単位シーケンスを含む文字列を渡したときに、空の文字列を返すのではなく Unicode の置換文字に置き換えます。UTF-8 の場合は U+FFFD、それ以外の場合は &#FFFD; となります。
ENT_DISALLOWED指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは &#FFFD; で置き換えます。これを設定しなければ、無効な符号位置をそのまま残します。これは、外部コンテンツを埋め込んだ XML 文書を整形式に保つために有用です。
ENT_HTML401コードを HTML 4.01 として処理します。
ENT_XML1コードを XML 1 として処理します。
ENT_XHTMLコードを XHTML として処理します。
ENT_HTML5コードを HTML 5 として処理します。



string $encoding = ini_get("default_charset")
文字変換時に使用する文字エンコーディングを指定。以下の「サポートする文字セット」を参照してください。
省略時の値は、varies PHP のバージョンによって異なります。以下を参考にしてください。
・PHP 5.6.0 以降 = default_charset の値
・PHP 5.4 および PHP 5.5 = UTF-8
・それ以前 = ISO-8859-1
※PHP 5.5 以前や、default_charset が入力と違う文字セットの場合は、省略せずに適切な値を指定することを推奨。

サポートする文字セット
文字セットエイリアス説明
ISO-8859-1ISO8859-1西欧、Latin-1
ISO-8859-5ISO8859-5ほとんど使われないキリル文字セット (Latin/Cyrillic)。
ISO-8859-15ISO8859-15西欧、Latin-9 。Latin-1(ISO-8859-1) に欠けている ユーロ記号やフランス・フィンランドの文字を追加したもの。
UTF-8ASCII 互換のマルチバイト 8 ビット Unicode 。
cp866ibm866, 866DOS 固有のキリル文字セット。
cp1251Windows-1251, win-1251, 1251Windows 固有のキリル文字セット。
cp1252Windows-1252, 1252西欧のためのWindows固有の文字セット。
KOI8-Rkoi8-ru, koi8rロシア語。
BIG5950繁体字中国語。主に台湾で使用されます。
GB2312936簡体字中国語。国の標準文字セットです。
BIG5-HKSCSBig5 に香港の拡張を含めたもの。繁体字中国語。
Shift_JISSJIS, SJIS-win, cp932, 932日本語。
EUC-JPEUCJP, eucJP-win日本語。
MacRomanMac OS で使われる文字セット。
''空文字列を指定すると、スクリプトのエンコーディング(Zend multibyte)、default_charset、そして現在のロケール(nl_langinfo()およびsetlocale()を参照ください)の順でエンコーディングを検出します。この方法はおすすめしません。

注意: これら以外の文字セットは理解できません。かわりにデフォルトのエンコーディングを使用し、警告を発生させます。


bool $double_encode = TRUE
すでに変換されているHTMLエンティティがある場合、それをさらに変換するかどうかを指定します。デフォルトは、すでに変換済みのものも含めすべてを変換します。

返値 string
エンコード処理された後の文字列が返ります。

解説

この関数はhtmlentities()と同じですが、両者は「エンティティ変換として取り扱う対象」が違います。
htmlentities ではエンティティ変換可能なものはすべて対象となりますが、htmlspecialchars ではHTML タグとして認識されるものが変換対象となります(両者オプションによって変動があります)。
逆の処理(デコード) をしたい場合は、htmlspecialchars_decode()が利用可能です。







変換対象となる文字
変換前変換語
& (アンパサンド)&
" (ダブルクォート)ENT_NOQUOTES が指定されていない場合、"
' (シングルクォート)' (ENT_HTML401 の場合) あるいは ' ( ENT_XML1、ENT_XHTML、 ENT_HTML5 の場合)。ただし ENT_QUOTES が指定されている場合に限る
< (小なり) (大なり)>

※上記の以外の文字は変換が行われません。すべての変換を行いたい場合はhtmlentities()を参照してください。

記述サンプル

//PHP 7.4.6で実行
//文字列を指定
$string = "<a href='aiueo'>あいうえお</a>";

//実行
echo htmlspecialchars($string, ENT_QUOTES);

//結果
//&lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;&lt;a href=&#039;aiueo&#039;&gt;あいうえお&lt;/a&gt;

参考リンク

get_html_translation_table htmlspecialchars() および htmlentities() で用いられるエンティティの変換テーブルを配列で返す
htmlentities 適用可能な文字を全て HTML エンティティに変換する
htmlspecialchars_decode HTMLエンティティに変換されている特殊文字を元に戻す(デコード)
nl2br 文字列中の改行文字の前に改行タグ(<br /> <br>)を挿入する
strip_tags 文字列から HTML と PHP のタグを除去して返却

タグ

HTML エンティティ エンコード デコード 変換 String 文字列


公式リファレンス

書式

htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = ini_get("default_charset") [, bool $double_encode = TRUE ]]] ) : string

説明

文字の中には HTML において特殊な意味を持つものがあり、 それらの本来の値を表示したければ HTML の表現形式に変換してやらなければなりません。 この関数は、これらの変換を行った結果の文字列を返します。 入力文字列の中で名前付きエンティティに関連づけられたものを すべて変換する必要がある場合には、代わりに htmlentities() を使用してください。

この関数への入力文字列と最終的なドキュメントとの間で文字セットが一致している場合は、 この関数を使えば HTML ドキュメントに組み込むための準備として十分です。 しかし、この関数への入力の中に、最終的なドキュメントの文字セットでは符号化できない文字がある場合もあります。 そんな文字も (数値エンティティや名前つきエンティティなどで) 残したい場合は、 この関数と htmlentities() (これは、名前付きエンティティに対応する文字しか置換しません) を使うだけでは不十分です。そんな場合は mb_encode_numericentity() を使う必要があります。

変換対象となる文字
変換前 変換語
& (アンパサンド) &amp;
" (ダブルクォート) ENT_NOQUOTES が指定されていない場合、&quot;
' (シングルクォート) &#039; (ENT_HTML401 の場合) あるいは &apos; ( ENT_XML1、ENT_XHTML、 ENT_HTML5 の場合)。ただし ENT_QUOTES が指定されている場合に限る
< (小なり) &lt;
> (大なり) &gt;

パラメータ

string
変換される文字列。
flags
以下のフラグを組み合わせたビットマスクです。 クォートや無効な符号単位シーケンス、そして文書型の扱いを指定します。 デフォルトは ENT_COMPAT | ENT_HTML401 です。
利用可能な flags 定数
定数名 説明
ENT_COMPAT ダブルクオートは変換しますがシングルクオートは変換しません。
ENT_QUOTES シングルクオートとダブルクオートを共に変換します。
ENT_NOQUOTES シングルクオートとダブルクオートは共に変換されません。
ENT_IGNORE 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく無効な部分を切り捨てるようになります。 このフラグは使わないようにしましょう。 » セキュリティの問題が発生する可能性があります。
ENT_SUBSTITUTE 無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく Unicode の置換文字に置き換えます。 UTF-8 の場合は U+FFFD、それ以外の場合は &#xFFFD; となります。
ENT_DISALLOWED 指定した文書型において無効な符号位置を、Unicode の代替文字である U+FFFD (UTF-8) あるいは &#xFFFD; で置き換えます。 これを設定しなければ、無効な符号位置をそのまま残します。 これは、外部コンテンツを埋め込んだ XML 文書を整形式に保つために有用です。
ENT_HTML401 コードを HTML 4.01 として処理します。
ENT_XML1 コードを XML 1 として処理します。
ENT_XHTML コードを XHTML として処理します。
ENT_HTML5 コードを HTML 5 として処理します。
encoding
オプションの引数。文字を変換するときに使うエンコーディングを定義します。 省略した場の encoding のデフォルト値は、varies PHP のバージョンによって異なります。 PHP 5.6.0 以降では、デフォルト値として default_charset の値を使います。PHP 5.4 と PHP 5.5 のデフォルト値は、 UTF-8 で、それより前のバージョンの PHP のデフォルト値は ISO-8859-1 でした。 技術的にはこの引数を省略可能ですが、PHP 5.5 以前のバージョンを使っている場合や、 default_charset の指定が入力とは違う文字セットになっている場合は、 適切な値を指定しておくことを強く推奨します。 この関数を使ううえでは ISO-8859-1 と ISO-8859-15、 UTF-8、cp866、 cp1251、cp1252 そして KOI8-R は事実上同等です。 string 自体がそのエンコーディングにおける有効な文字列である限り、 これらのエンコーディングでは htmlspecialchars() の影響が及ぶ文字がみな同じ位置にあるからです。 以下の文字セットをサポートします。
サポートする文字セット
文字セット エイリアス 説明
ISO-8859-1 ISO8859-1 西欧、Latin-1
ISO-8859-5 ISO8859-5 ほとんど使われないキリル文字セット (Latin/Cyrillic)。
ISO-8859-15 ISO8859-15 西欧、Latin-9 。Latin-1(ISO-8859-1) に欠けている ユーロ記号やフランス・フィンランドの文字を追加したもの。
UTF-8   ASCII 互換のマルチバイト 8 ビット Unicode 。
cp866 ibm866, 866 DOS 固有のキリル文字セット。
cp1251 Windows-1251, win-1251, 1251 Windows 固有のキリル文字セット。
cp1252 Windows-1252, 1252 西欧のための Windows 固有の文字セット。
KOI8-R koi8-ru, koi8r ロシア語。
BIG5 950 繁体字中国語。主に台湾で使用されます。
GB2312 936 簡体字中国語。国の標準文字セットです。
BIG5-HKSCS   Big5 に香港の拡張を含めたもの。繁体字中国語。
Shift_JIS SJIS, SJIS-win, cp932, 932 日本語。
EUC-JP EUCJP, eucJP-win 日本語。
MacRoman   Mac OS で使われる文字セット。
''   空文字列を指定すると、 スクリプトのエンコーディング (Zend multibyte)、 default_charset、 そして現在のロケール (nl_langinfo() および setlocale() を参照ください) の順でエンコーディングを検出します。 この方法はおすすめしません。
注意: これら以外の文字セットは理解できません。 かわりにデフォルトのエンコーディングを使用し、警告を発生させます。
double_encode
double_encode をオフにすると、PHP は既存の html エンティティをエンコードしません。 デフォルトでは、既存のエンティティも含めてすべてを変換します。

返値

変換後の文字列を返します。 入力の string の中に エンコーディング encoding における無効なコードユニットシーケンスが含まれており、 かつ ENT_IGNORE フラグが設定されていなければ、 htmlspecialchars() は空文字列を返します。

注意

注意: この関数は上記のあげたもの以外に関しては一切の変換を行わないことに注意してください。 すべての変換を行うには htmlentities() を参照してください。
注意: flags の値が曖昧な場合、以下のルールが適用されます:
  • ENT_COMPAT, ENT_QUOTES, ENT_NOQUOTES のいずれも存在しない場合、 デフォルトは ENT_NOQUOTES になります。
  • ENT_COMPAT, ENT_QUOTES, ENT_NOQUOTES のうちひとつ以上が存在する場合、 ENT_QUOTES がもっとも優先度が高くなり、 その後に ENT_COMPAT が続きます。
  • ENT_HTML401, ENT_HTML5, ENT_XHTML, ENT_XML1 のいずれも存在しなければ、 デフォルトは ENT_HTML401 になります。
  • ENT_HTML401, ENT_HTML5, ENT_XHTML, ENT_XML1 のうちひとつ以上が存在している場合、 ENT_HTML5 が最も優先度が高くなり、 ENT_XHTML, ENT_XML1 そして ENT_HTML401 の順に続きます。
  • ENT_DISALLOWED, ENT_IGNORE, ENT_SUBSTITUTE のうち、ひとつ以上が存在している場合、 ENT_IGNORE の優先度がもっとも高くなり、 ENT_SUBSTITUTE がその後に続きます。

サンプル

例1 htmlspecialchars() の例

$new = htmlspecialchars("Test", ENT_QUOTES); echo $new; // <a href='test'>Test</a>

参考

  • get_html_translation_table() - htmlspecialchars および htmlentities で使用される変換テーブルを返す
  • htmlspecialchars_decode() - 特殊な HTML エンティティを文字に戻す
  • strip_tags() - 文字列から HTML および PHP タグを取り除く
  • htmlentities() - 適用可能な文字を全て HTML エンティティに変換する
  • nl2br() - 改行文字の前に HTML の改行タグを挿入する
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール