Awjudd\FeedReaderを通してSimplePieを使ってRSSフィードを操作しようとして嵌まったのでメモ。
嵌まったこと
- はてなブックマークのRSSを取得して処理しようとすると、contentにHTMLが結構な量書き込まれていて、JSONに直して書き出すと処理が大変
- contentを書き出さないようにしても、get_description()してdescriptionがなかったら自動的にcontentを持ってきてくれる親切設計
コメント(description)だけ欲しいのにどうしたらいいんや……
解決策:get_description(true)とする
ドキュメントがすごい見づらいので、探しつつ使い方を学ばなければならないんですけど、SimplePie_Item::get_description()の部分にこうありました。
Parameters
$description_only
boolean
Should we avoid falling back to the content?
つまり、$description_onlyがfalse(デフォルト)だと、descriptionがなかった場合に自動的にcontentを探すよってことらしいです。なので、その必要はない(descriptionが空なら空でOK)時には、trueを渡す必要があります。てか、そっちがデフォルトじゃないのか。
解決策:JSONにエンコードするときにタグを変換する
もっとよい解決策を知ったので追記。
加えてContent-Typeもちゃんとapplication/jsonにしてくれる。
[Laravel]レスポンスをJSON形式で返す方法2つ – Qiita
配列をreturnするだけでいいかんじに調整してJSONエンコードしてくれた上で、Content-Typeも調整してくれる!
マジかー。
「こんなことする必要はないよ」ということでそれを知る前にやってたことも一応残しておきます。
内部では同じようなことしてるんだろうか。
json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] ) : string
この$optionsに「JSON_HEX_TAG」を指定してやると、すべての をそれぞれ \u003C および \u003E に変換します。同様に「JSON_HEX_AMP」「JSON_HEX_APOS」「JSON_HEX_QUOT」を指定してやると安心です。
こんな感じ。
return json_encode($data,JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
まとめ
ドキュメントを読みましょう。ドキュメント読んで解らなかったらソースコードを読みましょう。でもドキュメントに書いてあると嬉しいなあ。