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

前回記事にしたものよりパワーアップしたものをご紹介します。といっても単純にまた新たな関数を見つけただけなんですけどね。クラス関数であったんですねー、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",
	"https://php-fan.org/feed"
);
 
foreach ($rss_urls as $url) {
	getRss($url);
}
 
?>

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

デモサイト

Pocket
LINEで送る

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です