[ PHP ] HTML エンコード / デコード ( htmlentities / html_entity_decode )

Pocket

ここでは、HTML エンコードとデコードをおこなうサンプルを掲載しています。エンコードには htmlentities 関数と htmlspecialchars 関数を使用し、デコードには html_entity_decode 関数と htmlspecialchars_decode 関数を使用しています。

スポンサーリンク

HTML エンコード

PHP で HTML エンコードを行うには、htmlentities および htmlspecialchars 関数を使用することができます。それぞれのエンコードサンプルになります。

// エンコードする文字列
$org = '<>&"\' ©';

/*
 * HTML エンコード
 */
$encode1 = htmlentities($org, ENT_QUOTES, 'UTF-8');
var_dump($encode1);
// '&lt;&gt;&amp;&quot;&#039; &copy;'

$encode2 = htmlspecialchars($org, ENT_QUOTES, 'UTF-8');
var_dump($encode2);
// '&lt;&gt;&amp;&quot;&#039; ©'

2つの関数の違いは、htmlentities がエンコード可能なものはすべてエンコードしますが、 htmlspecialchars は、不等号(<>)、アンパサンド(&)、シングルコーテーション(’)、ダブルコーテーション(”) のみをエンコードします。htmlentities では コピーライト文字もエンコードされていることがわかりますが、htmlspecialchars ではコピーライト ( © ) のエンコードは行われていません。

エンコードルールを変更する

htmlentities および htmlspecialchars 関数の第2パラメータによってエンコードルールを変更することができます。エンコードルールを下表に示します。必要に応じて使い分けを行うことができます。

第2パラメータ 定数名 意味
ENT_COMPAT ダブルクオートのみを変換し、 シングルクオートをそのままにします
ENT_QUOTES ダブルおよびシングルクオートを共に変換します
ENT_NOQUOTES ダブルクオートおよびシングルクオートを共に変換しません
ENT_IGNORE 無効なコードシーケンスが含まれる文字列を渡した場合に、 空の文字列を返すのではなく無効な部分を切り捨てます。 PHP 5.3.0 で追加されました。 これは、過去との互換性を確保するために用意されているものです。 セキュリティの問題があるので、使わないようにしましょう。
HTML デコード

HTML デコードをするために html_entity_decode 関数または htmlspecialchars_decode 関数を使用することができます。前述の HTML エンコード文字列をデコードさせるサンプルになります。

// エンコードする文字列
$org = '<>&"\' ©'; 

/*
 * HTML エンコード
 */
$encode1 = htmlentities($org, ENT_QUOTES, 'UTF-8');
var_dump($encode1);
// '&lt;&gt;&amp;&quot;&#039; &copy;'

$encode2 = htmlspecialchars($org, ENT_QUOTES, 'UTF-8');
var_dump($encode2);
// '&lt;&gt;&amp;&quot;&#039; ©'

/*
 * HTML デコード
 */
var_dump(html_entity_decode($encode1 . '&nbsp;', ENT_QUOTES, 'UTF-8'));
// '<>&"&apos; © '

var_dump(html_entity_decode($encode2 . '&nbsp;', ENT_QUOTES, 'UTF-8'));
// '<>&"&apos; © '

var_dump(htmlspecialchars_decode($encode1 . '&nbsp;', ENT_QUOTES));
// '<>&"&apos; &copy;&nbsp;'

var_dump(htmlspecialchars_decode($encode2 . '&nbsp;', ENT_QUOTES));
// '<>&"&apos; ©&nbsp;'

デコード結果より、html_entity_decode 関数は htmlentities 関数の逆変換を行い、 htmlspecialchars_decode 関数は htmlspecialchars 関数の逆変換を行っていることがわかります。

サンプルコードを補足すると、半角スペースを htmlentities, htmlspecialchars でエンコードしても &nbsp; には変換されませんが、&nbsp; を html_entity_decode でデコードした場合は半角スペースに変換されます。ただし、htmlspecialchars_decode でデコードしても半角スペースには変換されません。

html_entity_decode 関数の使用上の注意点

html_entity_decode では、アポストロフィ ( シングルコーテーション )が &apos; に変換されている点に 注意が必要です。シングルコーテーションをエンコードすると &#039; になりますが、&#039; をデコードすると シングルコーテーションではなくシングルコーテーションの実体名(&apos;)に変換されています。例えば (少なくとも ) IE6 ~ IE8 では &apos; をシングルコーテーションとして表示してはくれません。この問題を回避するためには、htmlentities や html_entity_decode の第2パラメータでシングルコーテーションのコード変換を行わないようにするなどの対策を行う必要があります。なお本サンプルは、PHP5.3.5 ( windows ) での検証結果です。

参考

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *