htmlspecialchars_decodeはやめて、html_entity_decodeで実態参照をデコード
htmlspecialchars_decodeの場合
探せば関数があるでお馴染みのPHP
<p>hoge huga<></p>
こんな、HTMLのタグ内の文字数を数えたくて実態参照を戻す関数ないかな?と思ったらあった。
htmlspecialchars_decode
<?php // $htmlに変換したいhtmlが格納されているとする $html = strip_tags(htmlspecialchars_decode($html)); var_dump($html);
理想
string 'hoge huga<>' (length=11)
現実
string 'hoge huga' (length=14)
が変換されないわ、<>がタグ扱いされるわ、散々たる結果に。まぁ、後半は自業自得ですが。一気に変換しようとせずに、テキスト取ってきてから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(' ', ' ', $html);