Rss/Atomフィードの取得方法(改良版)

rss

前回記事にしたものよりパワーアップしたものをご紹介します。といっても単純にまた新たな関数を見つけただけなんですけどね。クラス関数であったんですねー、SimpleXMLElementなんて関数知らなかったなー。

前回とほぼ同じですね。一応自作のエスケープ関数やリンクチェック関数も付け足しております。前回よりすっきりとしてわかりやすくなったかも。
バージョンアップしておりますがどっちがいいんだろうと思う今日この頃。


スポンサーリンク


フィード取得

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
function escape($value, $enc = 'UTF-8') {
	if (is_array($value)) {
		return array_map('escape', $value);
	}
	return htmlspecialchars($value, ENT_QUOTES, $enc);
}
 
function checkLink($link) {
	return filter_var($link, FILTER_VALIDATE_URL) ? $link : null;
}
 
function outPutItem($title, $link, $content, $date) {
	$dt = new DateTime($date);
	$time = $dt->format('Y/m/d H:i:s');
	$content = strip_tags($content);
	$content = mb_strimwidth($content, 0, 150, '・・・', 'UTF-8');
	printf('<dl><dt><a href="%s" target="_blank">%s</a>(%s)</dt>', checkLink($link), escape($title), $time);
	printf('<dd>%s</dd></dl>', $content);
}
 
function getRss($url, $maxsize = 5) {
 
	try {
		$rss = new SimpleXMLElement($url, null, true);
 
		$i = 0;
		if (isset($rss->channel->title)) {
			$site_name = $rss->channel->title;
			$site_url  = $rss->channel->link;
		} else {
			$site_name = $rss->title;
			$site_url  = $rss->link['href'];
		}
		printf('<h2><a href="%s" target="_blank">%s</a></h2>',  $site_url, $site_name);
 
		switch (strtolower($rss->getName())) {
			case 'rdf': // rss1.0
			foreach ($rss->item as $item) {
				if($i >= $maxsize){
					break;
				} else {
					$i++;
					$title   = $item->title;
					$link    = $item->link;
					$content = $item->description;
					$date    = $item->children('http://purl.org/dc/elements/1.1/')->date;
					outPutItem($title, $link, $content, $date);
				}
			}
			break;
			case 'rss': // rss2.0
			foreach ($rss->channel->item as $item) {
				if($i >= $maxsize){
					break;
				} else {
					$i++;
					$title   = $item->title;
					$link    = $item->link;
					$content = $item->description;
					$date    = $item->pubDate;
					outPutItem($title, $link, $content, $date);
				}
			}
			break;
			case 'feed': // atom
			foreach ($rss->entry as $entry) {
				if($i >= $maxsize){
					break;
				} else {
					$i++;
					if (isset($entry->issued)) {
						$date = $entry->issued;
					} else {
						$date = $entry->published;
					}
 
					$title   = $entry->title;
					$link    = $entry->link['href'];
					$content = $entry->content;
					outPutItem($title, $link, $content, $date);
				}
			}
			break;
		}
	} catch (Exception $e) {
		echo $e->getMessage();
	}
}
?>

ココからは出力側です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$rss_urls = array(
	"http://news.atode.cc/rss.php",
	"http://gigazine.net/news/rss_2.0/",
	"http://feeds.feedburner.com/phpspot/ccuf",
	"http://getnews.jp/feed/ext/orig",
	"http://rss.rssad.jp/rss/oshietekun/atom.xml",
	"http://php-fan.org/feed"
);
 
foreach ($rss_urls as $url) {
	getRss($url);
}
 
?>

こんなかんじですー、前回と同じ表示になっています。
デモサイトにて確認してみてください。

デモサイト

Pocket
LINEで送る


スポンサーリンク

コチラの記事もどうぞ!
You can leave a response, or trackback from your own site.

コメントがあります “Rss/Atomフィードの取得方法(改良版)”

  1. […] 用的に取得できる必要がある。 ということでこちらの記事を参考に関数にしてみた。 […]

コメントをお寄せ下さい

Subscribe to RSS Feed Follow me on Twitter!