本文实例讲述了php生成RSS订阅的方法。具体分析如下:
RSS(简易信息聚合,也叫聚合内容)是一种描述和同步网站内容的格式。RSS可以是以下三个解释的其中一个: Really Simple Syndication;RDF (Resource Description Framework) Site Summary; Rich Site Summary。但其实这三个解释都是指同一种Syndication的技术。RSS目前广泛用于网上新闻频道,blog和wiki。使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新。网络用户可以在客户端借助于支持RSS的聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。
从技术上来说一个RSS文件就是一段规范的XML数据,该文件一般以rss,xml或者rdf作为后缀,下面是一段 rss 文件的内容示例:
代码如下:
?xml version= 1.0 encoding= utf-8 ? rss version= 2.0 channel title PHP /title link //www.VeVb.com/ /link description PHP /description item title RSS Tutorial /title link 网站地址/rss /link description New RSS tutorial on W3School /description /item item title XML Tutorial /title link 网站地址/xml /link description New XML tutorial on W3School /description /item /channel /rss
下面分享一段使用 php 动态生成 RSS 的代码示例:
代码如下:
?php ** php 动态生成 RSS 类 define( TIME_ZONE , define( FEEDCREATOR_VERSION , www.jb51.net //您的网址 html' target='_blank'>class FeedItem extends HtmlDescribable{ var $title,$description,$link; var $author,$authorEmail,$image,$category,$comments,$guid,$source,$creator; var $date; var $additionalElements=Array(); class FeedImage extends HtmlDescribable{ var $title,$url,$link; var $width,$height,$description; class HtmlDescribable{ var $descriptionHtmlSyndicated; var $descriptionTruncSize; function getDescription(){ $descriptionField=new FeedHtmlField($this- description); $descriptionField- syndicateHtml=$this- descriptionHtmlSyndicated; $descriptionField- truncSize=$this- descriptionTruncSize; return $descriptionField- output(); class FeedHtmlField{ var $rawFieldContent; var $truncSize,$syndicateHtml; function FeedHtmlField($parFieldContent){ if($parFieldContent){ $this- rawFieldContent=$parFieldContent; function output(){ if(!$this- rawFieldContent){ $result= } elseif($this- syndicateHtml){ $result= ![CDATA[ .$this- rawFieldContent. ]] }else{ if($this- truncSize and is_int($this- truncSize)){ $result=FeedCreator::iTrunc(htmlspecialchars($this- rawFieldContent),$this- truncSize); }else{ $result=htmlspecialchars($this- rawFieldContent); return $result; class UniversalFeedCreator extends FeedCreator{ var $_feed; function _setFormat($format){ switch (strtoupper($format)){ case 2.0 : // fall through case RSS2.0 : $this- _feed=new RSSCreator20(); break; case 0.91 : // fall through case RSS0.91 : $this- _feed=new RSSCreator091(); break; default: $this- _feed=new RSSCreator091(); break; $vars=get_object_vars($this); foreach ($vars as $key = $value){ // prevent overwriting of properties contentType , encoding do not copy _feed itself if(!in_array($key, array( _feed , contentType , encoding ))){ $this- _feed- {$key}=$this- {$key}; function createFeed($format= RSS0.91 ){ $this- _setFormat($format); return $this- _feed- createFeed(); function saveFeed($format= RSS0.91 ,$filename= ,$displayContents=true){ $this- _setFormat($format); $this- _feed- saveFeed($filename,$displayContents); function useCached($format= RSS0.91 ,$filename= ,$timeout=3600){ $this- _setFormat($format); $this- _feed- useCached($filename,$timeout); class FeedCreator extends HtmlDescribable{ var $title,$description,$link; var $syndicationURL,$image,$language,$copyright,$pubDate,$lastBuildDate,$editor,$editorEmail,$webmaster,$category,$docs,$ttl,$rating,$skipHours,$skipDays; var $xslStyleSheet= var $items=Array(); var $contentType= application/xml var $encoding= utf-8 var $additionalElements=Array(); function addItem($item){ $this- items[]=$item; function clearItem2Null(){ $this- items=array(); function iTrunc($string,$length){ if(strlen($string) =$length){ return $string; $pos=strrpos($string, . if($pos =$length-4){ $string=substr($string,0,$length-4); $pos=strrpos($string, . if($pos =$length*0.4){ return substr($string,0,$pos+1). ... $pos=strrpos($string, if($pos =$length-4){ $string=substr($string,0,$length-4); $pos=strrpos($string, if($pos =$length*0.4){ return substr($string,0,$pos). ... return substr($string,0,$length-4). ... function _createGeneratorComment(){ return !-- generator=/ .FEEDCREATOR_VERSION. / -- /n function _createAdditionalElements($elements,$indentString= ){ $ae= if(is_array($elements)){ foreach($elements AS $key = $value){ $ae.= $indentString. $key $value /$key /n return $ae; function _createStylesheetReferences(){ $xml= if($this- cssStyleSheet) $xml .= ?xml-stylesheet href=/ .$this- cssStyleSheet. / type=/ text/css/ ? /n if($this- xslStyleSheet) $xml .= ?xml-stylesheet href=/ .$this- xslStyleSheet. / type=/ text/xsl/ ? /n return $xml; function createFeed(){} function _generateFilename(){ $fileInfo=pathinfo($_SERVER[ PHP_SELF ]); return substr($fileInfo[ basename ],0,-(strlen($fileInfo[ extension ])+1)). .xml function _redirect($filename){ Header( Content-Type: .$this- contentType. charset= .$this- encoding. filename= .basename($filename)); Header( Content-Disposition: inline; filename= .basename($filename)); readfile($filename, r die(); function useCached($filename= ,$timeout=3600){ $this- _timeout=$timeout; if($filename== ){ $filename=$this- _generateFilename(); if(file_exists($filename) (time()-filemtime($filename) $timeout)){ $this- _redirect($filename); function saveFeed($filename= ,$displayContents=true){ if($filename== ){ $filename=$this- _generateFilename(); $feedFile=fopen($filename, w+ if($feedFile){ fputs($feedFile,$this- createFeed()); fclose($feedFile); if($displayContents){ $this- _redirect($filename); }else{ echo br / b Error creating feed file, please check write permissions. /b br / class FeedDate{ var $unix; function FeedDate($dateString= ){ if($dateString== ) $dateString=date( r if(is_integer($dateString)){ $this- unix=$dateString; return; if(preg_match( ~(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),//s+)?(//d{1,2})//s+([a-zA-Z]{3})//s+(//d{4})//s+(//d{2}):(//d{2}):(//d{2})//s+(.*)~ ,$dateString,$matches)){ $months=Array( Jan = 1, Feb = 2, Mar = 3, Apr = 4, May = 5, Jun = 6, Jul = 7, Aug = 8, Sep = 9, Oct = 10, Nov = 11, Dec = $this- unix=mktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]); if(substr($matches[7],0,1)== + OR substr($matches[7],0,1)== - ){ $tzOffset=(substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60; }else{ if(strlen($matches[7])==1){ $oneHour=3600; $ord=ord($matches[7]); if($ord ord( M )){ $tzOffset=(ord( A ) - $ord - 1) * $oneHour; } elseif($ord = ord( M ) $matches[7]!= Z ){ $tzOffset=($ord - ord( M )) * $oneHour; } elseif($matches[7]== Z ){ $tzOffset=0; switch ($matches[7]){ case UT : case GMT : $tzOffset=0; $this- unix += $tzOffset; return; if(preg_match( ~(//d{4})-(//d{2})-(//d{2})T(//d{2}):(//d{2}):(//d{2})(.*)~ ,$dateString,$matches)){ $this- unix=mktime($matches[4],$matches[5],$matches[6],$matches[2],$matches[3],$matches[1]); if(substr($matches[7],0,1)== + OR substr($matches[7],0,1)== - ){ $tzOffset=(substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60; }else{ if($matches[7]== Z ){ $tzOffset=0; $this- unix += $tzOffset; return; $this- unix=0; function rfc822(){ $date=gmdate( Y-m-d H:i:s ,$this- unix); if(TIME_ZONE!= ) $date .= .str_replace( : , ,TIME_ZONE); return $date; function iso8601(){ $date=gmdate( Y-m-d H:i:s ,$this- unix); $date=substr($date,0,22) . : . substr($date,-2); if(TIME_ZONE!= ) $date=str_replace( +00:00 ,TIME_ZONE,$date); return $date; function unix(){ return $this- unix; class RSSCreator10 extends FeedCreator{ function createFeed(){ $feed= ?xml version=/ 1.0/ encoding=/ .$this- encoding. / ? /n $feed.= $this- _createGeneratorComment(); if($this- cssStyleSheet== ){ $cssStyleSheet= http://www.w3.org/2000/08/w3c-synd/style.css $feed.= $this- _createStylesheetReferences(); $feed.= rdf:RDF/n $feed.= xmlns=/ http://purl.org/rss/1.0// /n $feed.= xmlns:rdf=/ http://www.w3.org/1999/02/22-rdf-syntax-ns#/ /n $feed.= xmlns:slash=/ http://purl.org/rss/1.0/modules/slash// /n $feed.= xmlns:dc=/ http://purl.org/dc/elements/1.1// /n $feed.= channel rdf:about=/ .$this- syndicationURL. / /n $feed.= title .htmlspecialchars($this- title). /title /n $feed.= description .htmlspecialchars($this- description). /description /n $feed.= link .$this- link. /link /n if($this- image!=null){ $feed.= image rdf:resource=/ .$this- image- url. / / /n $now=new FeedDate(); $feed.= dc:date .htmlspecialchars($now- iso8601()). /dc:date /n $feed.= items /n $feed.= rdf:Seq /n for ($i=0;$i count($this- items);$i++){ $feed.= rdf:li rdf:resource=/ .htmlspecialchars($this- items[$i]- link). / / /n $feed.= /rdf:Seq /n $feed.= /items /n $feed.= /channel /n if($this- image!=null){ $feed.= image rdf:about=/ .$this- image- url. / /n $feed.= title .$this- image- title. /title /n $feed.= link .$this- image- link. /link /n $feed.= url .$this- image- url. /url /n $feed.= /image /n $feed.= $this- _createAdditionalElements($this- additionalElements, for ($i=0;$i count($this- items);$i++){ $feed.= item rdf:about=/ .htmlspecialchars($this- items[$i]- link). / /n //$feed.= dc:type Posting /dc:type /n $feed.= dc:format text/html /dc:format /n if($this- items[$i]- date!=null){ $itemDate=new FeedDate($this- items[$i]- date); $feed.= dc:date .htmlspecialchars($itemDate- iso8601()). /dc:date /n if($this- items[$i]- source!= ){ $feed.= dc:source .htmlspecialchars($this- items[$i]- source). /dc:source /n if($this- items[$i]- author!= ){ $feed.= dc:creator .htmlspecialchars($this- items[$i]- author). /dc:creator /n $feed.= title .htmlspecialchars(strip_tags(strtr($this- items[$i]- title, /n/r , ))). /title /n $feed.= link .htmlspecialchars($this- items[$i]- link). /link /n $feed.= description .htmlspecialchars($this- items[$i]- description). /description /n $feed.= $this- _createAdditionalElements($this- items[$i]- additionalElements, $feed.= /item /n $feed.= /rdf:RDF /n return $feed; class RSSCreator091 extends FeedCreator{ var $RSSVersion; function RSSCreator091(){ $this- _setRSSVersion( 0.91 $this- contentType= application/rss+xml function _setRSSVersion($version){ $this- RSSVersion=$version; function createFeed(){ $feed= ?xml version=/ 1.0/ encoding=/ .$this- encoding. / ? /n $feed.= $this- _createGeneratorComment(); $feed.= $this- _createStylesheetReferences(); $feed.= rss version=/ .$this- RSSVersion. / /n $feed.= channel /n $feed.= title .FeedCreator::iTrunc(htmlspecialchars($this- title),100). /title /n $this- descriptionTruncSize=500; $feed.= description .$this- getDescription(). /description /n $feed.= link .$this- link. /link /n $now=new FeedDate(); $feed.= lastBuildDate .htmlspecialchars($now- rfc822()). /lastBuildDate /n $feed.= generator .FEEDCREATOR_VERSION. /generator /n if($this- image!=null){ $feed.= image /n $feed.= url .$this- image- url. /url /n $feed.= title .FeedCreator::iTrunc(htmlspecialchars($this- image- title),100). /title /n $feed.= link .$this- image- link. /link /n if($this- image- width!= ){ $feed.= width .$this- image- width. /width /n if($this- image- height!= ){ $feed.= height .$this- image- height. /height /n if($this- image- description!= ){ $feed.= description .$this- image- getDescription(). /description /n $feed.= /image /n if($this- language!= ){ $feed.= language .$this- language. /language /n if($this- copyright!= ){ $feed.= copyright .FeedCreator::iTrunc(htmlspecialchars($this- copyright),100). /copyright /n if($this- editor!= ){ $feed.= managingEditor .FeedCreator::iTrunc(htmlspecialchars($this- editor),100). /managingEditor /n if($this- webmaster!= ){ $feed.= webMaster .FeedCreator::iTrunc(htmlspecialchars($this- webmaster),100). /webMaster /n if($this- pubDate!= ){ $pubDate=new FeedDate($this- pubDate); $feed.= pubDate .htmlspecialchars($pubDate- rfc822()). /pubDate /n if($this- category!= ){ $feed.= category .htmlspecialchars($this- category). /category /n if($this- docs!= ){ $feed.= docs .FeedCreator::iTrunc(htmlspecialchars($this- docs),500). /docs /n if($this- ttl!= ){ $feed.= ttl .htmlspecialchars($this- ttl). /ttl /n if($this- rating!= ){ $feed.= rating .FeedCreator::iTrunc(htmlspecialchars($this- rating),500). /rating /n if($this- skipHours!= ){ $feed.= skipHours .htmlspecialchars($this- skipHours). /skipHours /n if($this- skipDays!= ){ $feed.= skipDays .htmlspecialchars($this- skipDays). /skipDays /n $feed.= $this- _createAdditionalElements($this- additionalElements, for ($i=0;$i count($this- items);$i++){ $feed.= item /n $feed.= title .FeedCreator::iTrunc(htmlspecialchars(strip_tags($this- items[$i]- title)),100). /title /n $feed.= link .htmlspecialchars($this- items[$i]- link). /link /n $feed.= description .$this- items[$i]- getDescription(). /description /n if($this- items[$i]- author!= ){ $feed.= author .htmlspecialchars($this- items[$i]- author). /author /n // on hold if($this- items[$i]- source!= ){ $feed.= source .htmlspecialchars($this- items[$i]- source). /source /n if($this- items[$i]- category!= ){ $feed.= category .htmlspecialchars($this- items[$i]- category). /category /n if($this- items[$i]- comments!= ){ $feed.= comments .htmlspecialchars($this- items[$i]- comments). /comments /n if($this- items[$i]- date!= ){ $itemDate=new FeedDate($this- items[$i]- date); $feed.= pubDate .htmlspecialchars($itemDate- rfc822()). /pubDate /n if($this- items[$i]- guid!= ){ $feed.= guid .htmlspecialchars($this- items[$i]- guid). /guid /n $feed.= $this- _createAdditionalElements($this- items[$i]- additionalElements, $feed.= /item /n $feed.= /channel /n $feed.= /rss /n return $feed; class RSSCreator20 extends RSSCreator091{ function RSSCreator20(){ parent::_setRSSVersion( 2.0 }郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答