htmlspecialchars_decodeはやめて、html_entity_decodeで実態参照をデコード

htmlspecialchars_decodeの場合

探せば関数があるでお馴染みのPHP

<p>hoge&nbsp;huga&lt;&gt;</p>

こんな、HTMLのタグ内の文字数を数えたくて実態参照を戻す関数ないかな?と思ったらあった。
htmlspecialchars_decode

<?php
// $htmlに変換したいhtmlが格納されているとする
$html = strip_tags(htmlspecialchars_decode($html));
var_dump($html);


理想

string 'hoge huga<>' (length=11)


現実

string 'hoge&nbsp;huga' (length=14)


&nbsp;が変換されないわ、&lt;&gt;がタグ扱いされるわ、散々たる結果に。まぁ、後半は自業自得ですが。一気に変換しようとせずに、テキスト取ってきてからhtmlspecialchars_decodeにかけた方が、まだ良いですね。


でも、デコード対象が少ないよ。

html_entity_decodeの場合

探せば(ry
html_entity_decode

<?php
// $htmlに変換したいhtmlが格納されているとする
$html = html_entity_decode(strip_tags($html), ENT_QUOTES, 'UTF-8');
var_dump($html);


できる子

string 'hoge huga<>' (length=11)

二重エスケープ防止なエスケープ

デコードしてから、エスケープすれば確実!かと思いきや、半角スペースはエスケープされないので、別途置換。

<?php
$html = strip_tags($html);
$html = htmlentities(html_entity_decode($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES, 'UTF-8');
$html = str_replace(' ', '&nbsp;', $html);