●HTMLのパース
まずは、サンプルサイト
DeepRSS
をご覧ください。
このサンプルサイトは、単一RSSファイルを解析し、RSSが持っているリンク先の内容を取得し、UIで指定した、開始マークから終了マーク間のデータを表示する、というサンプルです。
サンプルとして作ったものなのですが、意外と実用性が高くて、個人的に使っています。
ニュースサイトのRSSでは、概要しか配信してくれないので、全文が一気に見れて、なかなかGoodです。
DeepRSS
をご覧ください。
このサンプルサイトは、単一RSSファイルを解析し、RSSが持っているリンク先の内容を取得し、UIで指定した、開始マークから終了マーク間のデータを表示する、というサンプルです。
サンプルとして作ったものなのですが、意外と実用性が高くて、個人的に使っています。
ニュースサイトのRSSでは、概要しか配信してくれないので、全文が一気に見れて、なかなかGoodです。
--
技術的には、
・指定文字列に挟まれた文字列を返す
・RSSリーダーを作る
・文字列中の相対パスを絶対パスに変換
といった知識を流用すれば問題なく作れます。
まず、「RSSリーダーを作る」の知識を使って、記事詳細のリンクを取得後、file_get_contentsで記事の内容を取得。
次に、「指定文字列に挟まれた文字列を返す」の知識を使って、取得したHTMLの指定文字列に挟まれた文字列を取得します。これが、HTMLのパース、にあたります。
なお、特定箇所の切り出しをしている関係上、取得したHTMLの信頼性は、著しく低いものになるので、タグはすべて削除した方が安全です。
タグを削除するには、strip_tagsという関数を使えばOKです。
また、第2引数に削除したくないタグを指定しておけば、そのまま残すことも出来ます。
サンプルサイトでは、pタグだけ残しておくようにしています。
ただ、このままだと、画像表示が出来ないので、考えないといけません。
まずは、画像タグの取得をします。
これには、preg_replaceと正規表現を使います。
例えば、記事全文のHTMLが$newsに格納されているとすると、
とすれば、$imgに画像のアドレスが格納されます。
$imgは、配列なので、foreachでループするだけです。
betweenは、「指定文字列に挟まれた文字列を返す」で紹介した自作関数です。
ここまできたら、「文字列中の相対パスを絶対パスに変換」の知識の出番です。
通常、RSS配信されている画像のアドレスは絶対パスなので、問題ないのですが、一般のウェブページでは、相対パスを使うのが一般的です。
そこで、以下のルールでのパス変換を行う必要があります。
画像のアドレスが
・絶対パス(http://ではじまる)なら、そのまま
・先頭文字が/なら、「http://」+「parse_url($記事URL,PHP_URL_HOST)」+「画像のアドレス」
・それ以外なら、記事URLの最後の/をstrrposで取得し、そこまでをベースアドレスとしたら、「ベースアドレス」+「/」+「画像のアドレス」
この三つの方法でパス変換をしておけば、すべてのケースが網羅できると思います。
ひとつひとつ、積み上げていけば、それほど大変なことではないですね。
--
技術的には、
・指定文字列に挟まれた文字列を返す
・RSSリーダーを作る
・文字列中の相対パスを絶対パスに変換
といった知識を流用すれば問題なく作れます。
まず、「RSSリーダーを作る」の知識を使って、記事詳細のリンクを取得後、file_get_contentsで記事の内容を取得。
次に、「指定文字列に挟まれた文字列を返す」の知識を使って、取得したHTMLの指定文字列に挟まれた文字列を取得します。これが、HTMLのパース、にあたります。
なお、特定箇所の切り出しをしている関係上、取得したHTMLの信頼性は、著しく低いものになるので、タグはすべて削除した方が安全です。
タグを削除するには、strip_tagsという関数を使えばOKです。
また、第2引数に削除したくないタグを指定しておけば、そのまま残すことも出来ます。
サンプルサイトでは、pタグだけ残しておくようにしています。
ただ、このままだと、画像表示が出来ないので、考えないといけません。
まずは、画像タグの取得をします。
これには、preg_replaceと正規表現を使います。
例えば、記事全文のHTMLが$newsに格納されているとすると、
$pattern = '/src="(.*?)".*?>/';
$replace = '[tag_img]$1[/tag_img]';
$ar = preg_replace($pattern,$replace,$news);
$img = between('[tag_img]','[/tag_img]',$ar);
とすれば、$imgに画像のアドレスが格納されます。
$imgは、配列なので、foreachでループするだけです。
betweenは、「指定文字列に挟まれた文字列を返す」で紹介した自作関数です。
ここまできたら、「文字列中の相対パスを絶対パスに変換」の知識の出番です。
通常、RSS配信されている画像のアドレスは絶対パスなので、問題ないのですが、一般のウェブページでは、相対パスを使うのが一般的です。
そこで、以下のルールでのパス変換を行う必要があります。
画像のアドレスが
・絶対パス(http://ではじまる)なら、そのまま
・先頭文字が/なら、「http://」+「parse_url($記事URL,PHP_URL_HOST)」+「画像のアドレス」
・それ以外なら、記事URLの最後の/をstrrposで取得し、そこまでをベースアドレスとしたら、「ベースアドレス」+「/」+「画像のアドレス」
この三つの方法でパス変換をしておけば、すべてのケースが網羅できると思います。
ひとつひとつ、積み上げていけば、それほど大変なことではないですね。
--
Comments
コメント入力は停止しています
海外からと思われるコメントスパムが横行しているため、全記事のコメント入力を停止しています。メッセージのある方は、ホームページの一番下に連絡欄がありますので、そちらからお願いします。