PHP 5.4以降html_entity_decodeは、最小限の説明で4つの新しいフラグを導入します
ENT_HTML401 Handle code as HTML 4.01.
ENT_XML1 Handle code as XML 1.
ENT_XHTML Handle code as XHTML.
ENT_HTML5 Handle code as HTML 5.
彼らが何のためにあるのかを理解したい。それらはどの場合に重要ですか?
私の推測では(ただし、私が間違っているかもしれませんが)、異なる標準はいくつかの異常な文字をエンコードしますが、他の文字はエンコードしないので、それを尊重するためにここにあります。
私の研究:htmlentitiesにも同じ最小限の説明があり、例もありません。私は運が悪いとググった。
これらの定数をhtmlspecialcharsページで見たとき、私はこれらの定数がどのような振る舞いをするのか疑問に思い始めました。ドキュメントがゴミだったので、PHPのソースコードを掘り始めました。
基本的に、これらの定数は、特定のエンティティがエンコードされているかどうか(またはhtml_entity_decode
に対してデコードされているかどうか)に影響します。最も明白な効果は、アポストロフィ('
)が'
(ENT_HTML401
の場合)または'
(その他の場合)にエンコードされているかどうかです。同様に、'
を使用するときにhtml_entity_decode
がデコードされるかどうかを決定します。 ('
は常にデコードされます)。
すべての使用法はext/standard/html.cとそのヘッダーファイルにあります。 ext/standard/html.hから:
#define ENT_HTML_DOC_HTML401 0
#define ENT_HTML_DOC_XML1 16
#define ENT_HTML_DOC_XHTML 32
#define ENT_HTML_DOC_HTML5 (16|32)
(ENT_HTML_DOC_
をENT_
に置き換えて、PHP定数名を取得します)
私はこれらの定数のすべての出現を探し始め、ENT_*
定数の動作について以下を共有できます。

は、ENT_HTML401
、およびENT_XHTML
とENT_XML1
の読み取り不可または無効な文字にデコードされます。ただし、ENT_HTML5
の場合、これは無効な文字と見なされるため、
のままになります。 ( C関数unicode_cp_is_allowed )ENT_SUBSTITUTE
を有効にすると、無効なコード単位シーケンス指定された文字セットの場合は�
に置き換えられます。 (ドキュメントの種類には依存しません!)ENT_DISALLOWED
を有効にすると、コードポイント指定されたドキュメントタイプでは許可されませんは�
に置き換えられます。 (文字セットには依存しません!)ENT_IGNORE
を使用すると、ENT_SUBSTITUTE
からの同じ無効なコードユニットシーケンスが削除され、置き換えは行われません(「ドキュメントタイプ」の選択に応じて、たとえばENT_HTML5
)
のENT_HTML5
を許可しない( 976行目 )ENT_XHTML
はENT_HTML401
とエンティティマップを共有します。唯一の違いは、'
はENT_XHTML
でアポストロフィに変換されますが、ENT_HTML401
は変換しません( この行 を参照)。ENT_HTML401
とENT_XHTML
は、まったく同じエンティティマップを使用します(前のポイントとの差を差し引いたもの)。 ENT_HTML5
は独自のマップを使用します。その他(現在ENT_XML1
)のデコードマップは非常に限られています(>
、&
、<
、'
、"
およびそれらに相当する数値) 。 ( C関数unescape_inverse_map を参照)htmlspecialchars
と考えると)、ENT_XML1
を除いて、すべてのエンティティマップはENT_HTML401
と同じものを使用します。それは'
ではなく'
を使用します。それはほとんどすべてをカバーします。すべてのエンティティの違いをリストするつもりはありませんが、代わりに https://github.com/php/php-src/tree/php-5.4.11/ext/standard/html_tables をポイントしたいと思います。 =各タイプのマッピングを含む一部のテキストファイル。
ENT_COMPAT(デフォルト)またはENT_NOQUOTESでhtmlspecialchars
を使用する場合、どれを選択してもかまいません(以下を参照)。私はここでいくつかの答えを見ましたSOこれは要約すると:
<input value="<?php echo htmlspecialchars($str, ENT_HTML5);?>" >
これはinsecureです。デフォルト値ENT_HTML401 | ENT_COMPAT
をオーバーライドします。これには、HTML5エンティティが使用されるという違いがありますが、引用符はエスケープされなくなりますalso!さらに、これは冗長なコードです。 htmlspecialchars
でエンコードする必要があるエンティティは、すべてのENT_HTML401
、ENT_HTML5
などで同じです。
代わりにENT_COMPAT
またはENT_QUOTES
を使用してください。後者は、属性(value='foo'
)にアポストロフィを使用する場合にも機能します。 htmlspecialchars
の引数が2つしかない場合は、その引数がデフォルトであるため、含めないでください(ENT_HTML401
は0です。覚えていますか?)。
ページ上(属性間ではなくタグ間)に何かを印刷する場合は、どちらを選択しても問題はありません。効果は同じです。数値ENT_NOQUOTES | ENT_HTML401
に等しい0
を使用するだけでも十分です。
ENT_SUBTITUTEおよびENT_DISALLOWEDについては、以下も参照してください。
テキストエディターまたはデータベースが非常に不安定で、US-ASCII以外の文字(UTF-8など)を含めることができない場合は、htmlentitiesを使用できます。それ以外の場合は、バイトをいくつか節約し、代わりにhtmlspecialcharsを使用します(上記を参照)。
ENT_HTML401
、ENT_HTML5
などを使用する必要があるかどうかは、ページの配信方法によって異なります。 HTML5ページ(<!doctype html>
)がある場合は、ENT_HTML5
を使用します。 XHTMLまたはXML?対応するENT_XHTML
またはENT_XML1
を使用します。 doctypeまたはプレーンなHTML4がない場合は、ENT_HTML401
(省略時のデフォルト)を使用します。
デフォルトでは、指定された文字セットに対して無効であるバイトシーケンスは削除されます。無効なバイトシーケンスの代わりに�
を使用するには、ENT_SUBSTITUTE
を指定します。 (&#FFFD;
は、UTF-8以外の文字セットに対して表示されることに注意してください)。ただし、ENT_IGNORE
を指定すると、ENT_SUBSTITUTE
を指定してもこれらの文字は表示されません。
ドキュメントタイプの無効な文字は、ENT_DISALLOWED
が指定されている場合、上記と同じ置換文字(またはそのエンティティ)に置き換えられます。これは、ENT_IGNORE
が設定されているかどうかに関係なく発生します(Doctypeの無効な文字とは関係ありません)。