Heim > php教程 > PHP源码 > Hauptteil

PHP生成RSS订阅的程序代码

WBOY
Freigeben: 2016-06-08 17:20:06
Original
1203 Leute haben es durchsucht

生成RSS非常的简单只需要使用rss格式然后生成输出到浏览器就可以了,重点就是要告诉浏览器你是rss格式的数据即可,具体来看个例子。

<script>ec(2);</script>


rss(简易信息聚合也叫聚合内容)是一种描述和同步网站内容的格式。下面的生成RSS订阅的代码:
rss XML结构

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>网站名称</title>
<link>http://www.111cn.net/</link>
<description>网站描述!</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>
Nach dem Login kopieren

RSS实例

<?php
class Rss {
public function createFeed() {
//RSS头部
$webUrl = &#39;http://&#39;.$_SERVER[&#39;HTTP_HOST&#39;];//网站地址
$webName = &#39;网站名称&#39;;    //网站名称
$webDesc = &#39;网站描述&#39;;    //网站描述
$html = &#39;<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>&#39;.$webName.&#39;</title>
<link>&#39;.$webUrl.&#39;</link>
<description>&#39;.$webDesc.&#39;</description>
&#39;.$this->createItem().&#39;
</channel>
</rss>
&#39;;
echo $html;
}
private function createItem() {
//RSS item
//$data可替换为自己的数据
$html = &#39;&#39;;
//文章数据
$data = array(
&#39;id&#39; => 1,
&#39;date&#39; => date(&#39;r&#39;, time()),
&#39;title&#39; => &#39;文章标题&#39;,
&#39;link&#39; => &#39;http://www.111cn.net&#39;,    //文章地址
&#39;description&#39; => &#39;网站描述&#39;
);
for($i = 0; $i < 6; $i++) {
$html .= &#39;
<item>
<title>&#39;.$data[&#39;title&#39;].&#39;</title>
<link>&#39;.$data[&#39;link&#39;].&#39;</link>
<pubDate>&#39;.$data[&#39;date&#39;].&#39;</pubDate>
<description><![CDATA[&#39;.$data[&#39;description&#39;].&#39;]]></description>
</item>
&#39;;
}
return $html;
}
}
header("Content-Type: text/xml; charset=utf-8");
$rss = new Rss();
$rss->createFeed();
exit;
?>
Nach dem Login kopieren

RSS Feed 生成后,如何设置才能给网站添加 RSS 呢?并且让 Firefox、IE7 或其它 Feed 机器人自动发现?很简单,在网页的 Head 节添加一个特定的 Link 标签即可,如下:

设置 title 为 Feed 标题,href 为 Feed 地址,一切就 OK 了!


例子2

<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0">

<channel>

<title>php程序员教程网</title>

<link>http://www.111cn.net/</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>
Nach dem Login kopieren

下面分享一段使用 php 动态生成 RSS 的代码示例:

<?php
/**
** php 动态生成 RSS 类
**/
define("TIME_ZONE","");
define("FEEDCREATOR_VERSION","www.111cn.net");//您的网址
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"=>12);
   $this->unix=mktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]);
   if(substr($matches[7],0,1)==&#39;+&#39; OR substr($matches[7],0,1)==&#39;-&#39;){
    $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)==&#39;+&#39; OR substr($matches[7],0,1)==&#39;-&#39;){
    $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) . &#39;:&#39; . 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");
 }
}
Nach dem Login kopieren

使用示例:

<?php
header(&#39;Content-Type:text/html; charset=utf-8&#39;);
$db=mysql_connect(&#39;127.0.0.1&#39;,&#39;root&#39;,&#39;123456&#39;);
mysql_query("set names utf8");
mysql_select_db(&#39;dbname&#39;,$db);
$brs=mysql_query(&#39;select * from article order by add_time desc limit 0,10&#39;,$db);
$rss=new UniversalFeedCreator();
$rss->title="页面标题";
$rss->link="网址http://";
$rss->description="rss标题";
while($rowbrs=mysql_fetch_array($brs)){
 $item=new FeedItem();
 $item->title =$rowbrs[&#39;subject&#39;];
 $item->link=&#39;http://www.111cn.net/&#39;;
 $item->description =$rowbrs[&#39;description&#39;];
 $rss->addItem($item);
}
mysql_close($db);
$rss->saveFeed("RSS2.0","rss.xml");
Nach dem Login kopieren

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage