3月15号发了一篇文章《通过RSS将wordpress的最新文章调用到其他网站》,一位朋友问我,RSS远程调用的时候如何取得feed源站点的文章全文,又如何控制feed的输出数量。关于这两个问题我做一下解答。
第一,全文输出得看feed源了,若对方提供全文输出,则用一段php代码是可以实现远程的RSS全文显示的。
代码如下:
<?php $RSSURL = "http://feeds2.feedburner.com/redlogpress"; $buff = ""; $fp = fopen($RSSURL,"r"); while ( !feof($fp) ) { $buff .= fgets($fp,4096); } fclose($fp); $parser = xml_parser_create(); xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); xml_parse_into_struct($parser,$buff,$values,$idx); xml_parser_free($parser); $channel_title = $values[2]["value"]; echo <<<__HTML__ <html> <head> <meta http-equiv='content-type' content='text/html; charset=UTF-8'> <title>$channel_title</title> <link rel='stylesheet' type='text/css' id='css' href='http://www.redren.net/themes/reddigi2/style.css'> </head> <body> <table border='0'> <tr> <td> <img src='http://www.redren.net/themes/reddigi2/images/logo.jpg'> </td> <td> $channel_title $channel_lastBuildDate<br> </td> </tr> __HTML__; $in_item = 0; foreach ($values as $value) { $tag = $value["tag"]; $type = $value["type"]; $value = $value["value"]; $tag = strtolower($tag); if ($tag == "item" && $type == "open") { $in_item = 1; } else if ($tag == "item" && $type == "close") { echo <<<EOM <tr> <td colspan='2' class='header'width='400'> <a href="$link">$title</a> </td> </tr> <tr> <td colspan='2' width='400'align='right'> $pubDate </td> </tr> <tr> <td colspan='2' width='400'> $description </td> </tr> <tr> <td> </td> </tr> EOM; $in_item = 0; } if ($in_item) { switch ($tag) { case "title": $title = $value; break; case "link": $link = $value; break; case "pubDate": $pubDate = $value; break; case "description": $description = $value; break; } } } echo <<< __HTMLEND__ </table> </body> </html> __HTMLEND__; ?>
这段代码靠一个css文件控制其输出格式,具体请仔细参阅代码。
第二,控制feed的输出条数,我提供另一种RSS读取的php代码,本例将RSS读取类先给封装一次,然后用传统的模板格式将其显示出来。
封装的RSS类,文件名设定为 rss.class.php,代码如下:
<?php class ReadRSS{ var $url; var $content; var $values; function ReadRSS($url){ $this->url=$url; } function ReadFile(){ $fp = fopen($this->url,"r"); while ( !feof($fp) ) { $this->content .= fgets($fp,4096); } fclose($fp); } function ReadXML(){ $parser = xml_parser_create();//建立xml解析器 xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);//忽略由空白字符组成的值 xml_parser_set_option($parser,XML_OPTION_TARGET_ENCODING,'UTF-8'); //设置编码,目前只支持ISO-8859-1、US-ASCII 和 UTF-8,也可以不设置,与目标编码一致 xml_parse_into_struct($parser,$this->content,$this->values); xml_parser_free($parser); } function RSS($n=10){ $this->ReadFile(); $this->ReadXML(); $in_item = 0; $i=0; $read=array(); foreach ($this->values as $value) { $tag = $value["tag"]; $type = $value["type"]; $value = $value["value"]; $tag = strtolower($tag); if ($tag == "item" && $type == "open") { $in_item = 1; } else if ($tag == "item" && $type == "close"){ $read[$i]['link']=$link; $read[$i]['title']=$title; if ($pubDate) { $read[$i]['pubDate']=$pubDate; } $read[$i]['description']=$description; $in_item = 0; $i++; if ($i>=$n) { break; } } if ($in_item) { switch ($tag) { case "title": $title = $value; break; case "link": $link = $value; break; case "pubDate": $pubDate = $value; break; case "description": $description = $value; break; } } } return $read; } } ?>
模板代码如下:
<html> <head> <meta http-equiv='content-type' content='text/html; charset=UTF-8'> <title>红人网事</title> </head> <body> <?php include_once('rssclass/rss.class.php'); $url="http://blog.redren.net/feed/"; $rss=new ReadRSS($url); $values=$rss->RSS(10); # 10 可以改成别的数字,比如5,这是读取feed的条数 foreach ($values as $value) { echo "<div><a href={$value['link']}>{$value['title']}</a></div>"; } ?> </body> </html>
这个模板调用了刚才建立的位于 rssclass 这个文件夹下的 rss.class.php RSS类。
如果你还希望个更简单的方法取得远程RSS信息,并且不在意SEO的效果的话,这里还有一篇通过 Google Ajax API 获取远程Feed信息的几个实例。《利用 Google Ajax API 的几个实例》
3 thoughts on “两个远程调用其他网站的RSS信息的方法”