目次
サンプル・プログラムの実行例
サンプル・プログラム
makeRSS.php | サンプル・プログラム本体。 |
pahooRSS.php | RSS処理に関わるクラス pahooRSS。 RSS処理に関わるクラスの使い方は「PHPで作るRSSビューア」「[https://www.pahoo.org/e-soul/webtech/php02/php02-38-01.shtm:title=PHPでRSSを作る]」「[https://www.pahoo.org/e-soul/webtech/php02/php02-52-01.shtm:title=PHPでRSSを作る(その2)]」を参照。include_path が通ったディレクトリに配置すること。 |
バージョン | 更新日 | 内容 |
---|---|---|
2.0.0 | 2023/09/24 | pahooRSSクラスに変更 |
1.2 | 2021/05/03 | PHP8対応,リファラチェック追加 |
1.1 | 2017/03/14 | PHP7対応 |
1.0 | 2014/06/28 | 初版 |
関数/メソッド | 機能 | 詳細 |
---|---|---|
class::pahooRSS | ||
__construct | コンストラクタ | |
__destruct | デストラクタ | |
isJapanese | 使用言語が日本語かどうかを判定する | |
setLanguage | 使用言語を設定する. | |
isError | エラーが発生しているかどうかを取得する. | |
getError | エラー番号を取得する. | |
getErrorMessage | エラー・メッセージを取得する. | |
resetError | エラー状態をリセットする. | |
isphp8over | PHP8以上かどうか検査する | |
parse | 指定したURLにあるフィード情報を解釈してプロパティ$itemsに代入する. | |
addParser | ユーザーが用意したパーサを追加する. | 情報を格納するプロパティ $items の構造は本ファイル冒頭を参照のこと. |
parseRSS091 | RSS 0.91 パーサ | チャンネル情報は添字0に、アイテム情報は添字1以降に格納する. |
parseRSS10 | RSS 1.0 パーサ | チャンネル情報は添字0に、アイテム情報は添字1以降に格納する. |
parseRSS11 | RSS 1.1 パーサ | チャンネル情報は添字0に、アイテム情報は添字1以降に格納する. |
parseRSS20 | RSS 2.0 パーサ | チャンネル情報は添字0に、アイテム情報は添字1以降に格納する. |
atom | Atom パーサ | チャンネル情報は添字0に、アイテム情報は添字1以降に格納する. |
maker | チャネル情報とフィード情報を与えてフィードを生成する. | 作成するフィードとして RSS1.0, RSS1.1, RSS2.0, Atomを選択できる. |
makeRSS10 | 与えたチャネル情報とフィード情報から RSS 1.0を生成する. | |
makeRSS11 | 与えたチャネル情報とフィード情報から RSS 1.1を生成する. | |
makeRSS20 | 与えたチャネル情報とフィード情報から RSS 2.0を生成する. | |
makeAtom | 与えたチャネル情報とフィード情報から Atomを生成する. |
解説:コンテンツの準備
実際にRSSを作成するときには、コンテンツ・データベースから取得するなどすればいいだろう。
$items[0] チャネルの情報 | ||
["title"] | タイトル | |
["link"] | URL | |
["rss"] | RSSのURL | |
["creator"] | 製作者 | |
["copyright"] | 著作権者 | |
["desctiption"] | 説明 | |
$items[1以上] フィードの情報 | ||
["title"] | タイトル | |
["link"] | URL | |
["desctiption"] | 説明 | |
["date"] | 更新日時(ISO 8601形式) |
55: $Items = array(
56: //チャネル情報
57: 0 => array(
58: 'link' => 'http://www.pahoo.org/',
59: 'rss' => 'http://www.pahoo.org/rss/pahoo.rdf',
60: 'title' => 'ぱふぅ家のホームページ',
61: 'description' => '武蔵野・三鷹の地域情報、鉄道や旅先の写真、PHPやMySQLなどを使ったWebアプリケーションの作り方まで、知的な情報満載のホームページです。',
62: 'creater' => 'studio pahoo',
63: 'copyright' => 'Copyright (c) studio pahoo, All rights reserved.'
64: ),
65: //フィード情報
66: 1 => array(
67: 'link' => 'http://www.pahoo.org/e-soul/webtech/php06/php06-21-01.shtm',
68: 'title' => 'PHPで2つの文章の類似度を計算する(WebAPI版)',
69: 'description' => 'PHPでYahoo! JAPAN WebAPIやKAKASIを利用し、異なる2つの文章の類似度を計算するプログラムを紹介する。2つの文章がまったく違うテーマを扱っているのかどうかを判定する際に役立つ。',
70: 'date' => '2014-06-22T01:04:02+09:00'
71: ),
72: 2 => array(
73: 'link' => 'http://www.pahoo.org/athome/vehicle/jreast/img20130323-043352.html',
74: 'title' => 'JR東日本 183系は直流区間専用車',
75: 'description' => '183系電車は1972年デビューの特急用車両で、485系に似ているが、こちらは直流区間線用である。1974年に登場した1000番台は非貫通型となり、強力な耐寒・耐雪構造となっており、上越線や中央本線へ導入された。',
76: 'date' => '2014-06-21T23:42:02+09:00'
77: ),
78: 3 => array(
解説:フィードの生成
489: /**
490: * チャネル情報とフィード情報を与えてフィードを生成する.
491: * 作成するフィードとして RSS1.0, RSS1.1, RSS2.0, Atomを選択できる.
492: * @param array $items チャネル情報とフィード情報
493: * @param string $method 作成するフィード(RSS1.0,RSS1.1,RSS2.0,Atom)
494: * @return string フィード(XMLテキスト)
495: */
496: function maker($items, $method='RSS1.0') {
497: $functions = array(
498: 'RSS1.0' => 'makeRSS10',
499: 'RSS1.1' => 'makeRSS11',
500: 'RSS2.0' => 'makeRSS20',
501: 'Atom' => 'makeAtom'
502: );
503:
504: foreach ($functions as $key=>$func) {
505: if ($key === $method) {
506: return $this->$func($items);
507: }
508: }
509: $this->error = 141;
510: throw new Exception($this->getErrorMessage());
511: return FALSE;
512: }
実際にフィードを作成するのは、後述するメソッドになる。
解説:RSS 1.0 フィードの生成
514: /**
515: * 与えたチャネル情報とフィード情報から RSS 1.0を生成する.
516: * @param array $items チャネル情報とフィード情報
517: * @return string XML文字列
518: */
519: function makeRSS10($items) {
520: //テンプレート読み込み
521: $xml = simplexml_load_string($this->templateRSS10);
522: if ($xml === FALSE) {
523: $this->error = 123;
524: throw new Exception($this->getErrorMessage());
525: return FALSE;
526: }
527:
528: //channel部作成
529: $channel = $xml->addChild('channel', NULL, $this->nameSpaces['RSS1.0']['xmlns']);
530: $channel->addAttribute('rdf:about', $items[0]['rss'], $this->nameSpaces['RSS1.0']['rdf']);
531: $channel->addChild('title', $items[0]['title']);
532: $channel->addChild('link', $items[0]['link']);
533: $channel->addChild('description', $items[0]['description']);
534: $channel->addChild('language', 'ja', $this->nameSpaces['RSS1.0']['dc']);
535: $channel->addChild('creater', $items[0]['creator'], $this->nameSpaces['RSS1.0']['dc']);
536: $channel->addChild('rights', $items[0]['copyright'], $this->nameSpaces['RSS1.0']['dc']);
537: $channel->addChild('date', date('c', time()), $this->nameSpaces['RSS1.0']['dc']);
538:
539: $node = $channel->addChild('items');
540: $node = $node->addChild('Sec', NULL, $this->nameSpaces['RSS1.0']['rdf']);
541:
542: for ($i = 1; $i < count($items); $i++) {
543: $e = $node->addChild('li', NULL, $this->nameSpaces['RSS1.0']['rdf']);
544: $e = $e->addAttribute('rdf:resource', $items[$i]['link'], $this->nameSpaces['RSS1.0']['rdf']);
545: }
546:
547: //item部作成
548: for ($i = 1; $i < count($items); $i++) {
549: $node = $xml->addChild('item', NULL, $this->nameSpaces['RSS1.0']['xmlns']);
550: $node->addAttribute('rdf:about', $items[$i]['link'], $this->nameSpaces['RSS1.0']['rdf']);
551: $node->addChild('title', $items[$i]['title']);
552: $node->addChild('link', $items[$i]['link']);
553: $node->addChild('description', $items[$i]['description']);
554: $node->addChild('date', $items[$i]['date'], $this->nameSpaces['RSS1.0']['dc']);
555: }
556:
557: return $xml->asXML();
558: }
77: //RSS1.0のテンプレート
78: $this->templateRSS10 =<<< EOT
79: <?xml version="1.0" encoding="utf-8" ?>
80: <rdf:RDF
81: xmlns="http://purl.org/rss/1.0/"
82: xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
83: xmlns:dc="http://purl.org/dc/elements/1.1/"
84: xml:lang="ja">
85: </rdf:RDF>
86:
87: EOT;
ここで注意するのが、XMLの名前空間(name space)だ。
「PHPでコロンを含むXML要素名を扱う方法」で紹介したが、コロンを含むXML要素は、コロンの前方が名前空間となっている。メソッド addChild や addAttribute を使って子ノードや属性を追加するときには、名前空間のURLを指定してやる必要がある。
114: //名前空間(name space)
115: $this->nameSpaces = array(
116: 'RSS1.0' => array(
117: 'xmlns' => 'http://purl.org/rss/1.0/',
118: 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
119: 'dc' => 'http://purl.org/dc/elements/1.1/',
120: 'lang' => 'ja'
121: ),
122: 'RSS1.1' => array(
123: 'xmlns' => 'http://purl.org/net/rss1.1#',
124: 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
125: 'about' => 'http://www.xml.com/xml/news.rss'
126: ),
127: 'ATOM' => array(
128: 'xmlns' => 'http://www.w3.org/2005/Atom'
129: )
130: );
生成した RSS 1.0 は、asXML メソッドを使って文字列として返す。
解説:RSS 1.1 フィードの生成
560: /**
561: * 与えたチャネル情報とフィード情報から RSS 1.1を生成する.
562: * @param array $items チャネル情報とフィード情報
563: * @return string XML文字列
564: */
565: function makeRSS11($items) {
566: //テンプレート読み込み
567: $xml = simplexml_load_string($this->templateRSS11);
568:
569: //channel部作成
570: $xml->addChild('title', $items[0]['title']);
571: $xml->addChild('link', $items[0]['link']);
572: $xml->addChild('description', $items[0]['description']);
573:
574: $node = $xml->addChild('items');
575: $node->addAttribute('rdf:parseType', 'Collection', $this->nameSpaces['RSS1.1']['rdf']);
576:
577: //item部作成
578: for ($i = 1; $i < count($items); $i++) {
579: $e = $node->addChild('item');
580: $e->addAttribute('rdf:about', $items[$i]['link'], $this->nameSpaces['RSS1.1']['rdf']);
581: $e->addChild('title', $items[$i]['title']);
582: $e->addChild('link', $items[$i]['link']);
583: $e->addChild('description', $items[$i]['description']);
584: }
585:
586: //xml宣言を除く
587: return preg_replace("/\<\?xml version=\"1.0\"\?\>\n/u", '', $xml->asXML());
588: }
解説:RSS 2.0 フィードの生成
590: /**
591: * 与えたチャネル情報とフィード情報から RSS 2.0を生成する.
592: * @param array $items チャネル情報とフィード情報
593: * @return string XML文字列
594: */
595: function makeRSS20($items) {
596: //テンプレート読み込み
597: $xml = simplexml_load_string($this->templateRSS20);
598: if ($xml === FALSE) {
599: $this->error = 123;
600: throw new Exception($this->getErrorMessage());
601: return FALSE;
602: }
603:
604: //channel部作成
605: $channel = $xml->addChild('channel', NULL);
606: $channel->addChild('title', $items[0]['title']);
607: $channel->addChild('link', $items[0]['link']);
608: $channel->addChild('description', $items[0]['description']);
609: $channel->addChild('language', 'ja');
610: $channel->addChild('pubDate', date('c', time()));
611: $channel->addChild('lastBuildDate', date('c', time()));
612:
613: //item部作成
614: for ($i = 1; $i < count($items); $i++) {
615: $node = $channel->addChild('item', NULL);
616: $node->addChild('title', $items[$i]['title']);
617: $node->addChild('link', $items[$i]['link']);
618: $node->addChild('description', $items[$i]['description']);
619: $node->addChild('pubDate', $items[$i]['date']);
620: }
621:
622: return $xml->asXML();
623: }
解説:Atom フィードの生成
625: /**
626: * 与えたチャネル情報とフィード情報から Atomを生成する.
627: * @param array $items チャネル情報とフィード情報
628: * @return string XML文字列
629: */
630: function makeAtom($items) {
631: //テンプレート読み込み
632: $xml = simplexml_load_string($this->templateAtom);
633: if ($xml === FALSE) {
634: $this->error = 123;
635: throw new Exception($this->getErrorMessage());
636: return FALSE;
637: }
638:
639: //チャネル情報作成
640: $xml->addChild('title', $items[0]['title']);
641: $link = $xml->addChild('link', NULL);
642: $link->addAttribute('href', $items[0]['link']);
643: $xml->addChild('updated', date('c', time()));
644: $author = $xml->addChild('author', NULL);
645: $author->addChild('name', $items[0]['creater']);
646:
647: //フィード情報作成
648: for ($i = 1; $i < count($items); $i++) {
649: $entry = $xml->addChild('entry', NULL);
650: $entry->addChild('title', $items[$i]['title']);
651: $link = $entry->addChild('link', NULL);
652: $link->addAttribute('href', $items[$i]['link']);
653: $entry->addChild('updated', $items[$i]['date']);
654: $entry->addChild('summary', $items[$i]['description']);
655: }
656:
657: return $xml->asXML();
658: }
参考サイト
- PHPで作るRSSビューア(ぱふぅ家のホームページ)
- PHPでコロンを含むXML要素名を扱う方法(ぱふぅ家のホームページ)
(2023年9月23日)pahooRSSクラスに変更した。RSS 2.0, Atomも作れるようにした。