facebookのrssのタイトルをUTF-8にデコードできた話

2014年07月24日

facebookのポストをrssで取得して出力しようとしたら、
タイトルの日本語が全部HTMLエンティティになってて、trimもなんにも上手くいかない。
なので、packしたり、html_entity_decode使ったりして変換しようとしたけれど、
どうにも言う事聞いてくれなくて、格闘した末うまくいったのでメモ。

// rss取得
// クラス
include_once(ABSPATH.WPINC.'class-simplepie.php');
$rss = new SimplePie();
// feed url
$rss->set_feed_url(array('あんなところ','こんなところ','のfeed url'));
$rss->init();
$maxitems = $rss->get_item_quantity(3);
// アイテム取得
$items = $rss->get_items(0,$maxitems);

// 出力ループ
foreach ($items as $item) :
    $title = $item->get_title();
    // 数値参照文字っぽいものを含む場合だけ処理
    // そうしないとまっとうなUTF-8タイトルまで破壊される
    if(preg_match('/&#x.{4};/',$title)){
        // get_title()メソッドで&が全て&に変換されてしまってたのでもとに戻す
        $title = preg_replace('/&/','&',$title);
        $title = mb_convert_encoding($title,'UTF-8','HTML-ENTITIES');
    }

    // こっから出力関係適当に
    ・・・・・
endforeach;

16進文字列取ってpackしてみたり、別のエンコード経由で変換してみたりと無駄なことをしていたことが判明。
ただし、エンティティと日本語の混合文字列だとどうなるか判らない模様。

コメント