首页 >php教程 >php手册 >解析RSS类

解析RSS类

WBOY
WBOY原创
2016-06-07 11:44:491329浏览

简单但功能强大的PHP解析RSS文件类。
by Vojtech Semecky, webmaster @ webdot . cz最新版本,更新类容,手册,示例参见: http://lastrss.webdot.cz/ http://sssui.com
我只是摘抄过来,由于英文不好,所以稍加汉化了注释/*<br>  ======================================================================<br>  lastRSS 0.9.1<br>  <br> 简单但功能强大的PHP解析RSS文件类。<br> by Vojtech Semecky, webmaster @ webdot . cz<br>  <br> 最新版本,更新类容,手册,示例参见:<br>      http://lastrss.webdot.cz/<br>     http://sssui.com<br> <br>  ----------------------------------------------------------------------<br>  LICENSE<br> <br>  This program is free software; you can redistribute it and/or<br>  modify it under the terms of the GNU General Public License (GPL)<br>  as published by the Free Software Foundation; either version 2<br>  of the License, or (at your option) any later version.<br> <br>  This program is distributed in the hope that it will be useful,<br>  but WITHOUT ANY WARRANTY; without even the implied warranty of<br>  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the<br>  GNU General Public License for more details.<br> <br>  To read the license please visit http://www.gnu.org/copyleft/gpl.html<br>  ======================================================================<br> */<br> /*<br>     $rss=new lastRSS();             //实例化<br>     $rss->cache_dir = 'cache';      //设置缓存目录,要手动建立<br>     $rss->cache_time = 3600;        //设置缓存时间。默认为0,即随访问更新缓存;建议设置为3600,一个小时<br>     $rss->default_cp = 'UTF-8';     //设置RSS字符编码,默认为UTF-8<br>     $rss->cp = 'GBK';               //设置输出字符编码,默认为GBK<br>     $rss->items_limit = 10;         //设置输出数量,默认为10<br>     $rss->date_format = 'U';        //设置时间格式。默认为字符串;U为时间戳,可以用date设置格式<br>     $rss->stripHTML = true;         //设置过滤html脚本。默认为false,即不过滤<br>     $rss->CDATA = 'content';        //设置处理CDATA信息。默认为nochange。另有strip和content两个选项<br> <br>     $url = 'http://hi.baidu.com/gincn/rss ';<br>     $data = $rss->Get($url);        //处理RSS并获取内容<br>     print_r($data);<br> */<br> /**<br> * lastRSS<br> * 简单但功能强大的PHP解析RSS文件类。<br> */<br> class lastRSS {<br>     // -------------------------------------------------------------------<br>     // 共有属性<br>     // -------------------------------------------------------------------<br>     var $default_cp = 'UTF-8';<br>     var $CDATA = 'nochange';<br>     var $cp = '';<br>     var $items_limit = 0;<br>     var $stripHTML = False;<br>     var $date_format = '';<br> <br>     // -------------------------------------------------------------------<br>     // 私有属性<br>     // -------------------------------------------------------------------<br>     var $channeltags = array ('title', 'link', 'description', 'language', 'copyright', 'managingEditor', 'webMaster', 'lastBuildDate', 'rating', 'docs');<br>     var $itemtags = array('title', 'link', 'description', 'author', 'category', 'comments', 'enclosure', 'guid', 'pubDate', 'source');<br>     var $imagetags = array('title', 'url', 'link', 'width', 'height');<br>     var $textinputtags = array('title', 'description', 'name', 'link');<br> <br>     // -------------------------------------------------------------------<br>     // 解析RSS文件,并返回关联数组。<br>     // -------------------------------------------------------------------<br>     function Get ($rss_url) {<br>         //如果启用缓存<br>         if ($this->cache_dir != '') {<br>             $cache_file = $this->cache_dir . '/rsscache_' . md5($rss_url);<br>             $timedif = @(time() - filemtime($cache_file));<br>             if ($timedif cache_time) {<br>                 // 缓存文件是最新,则返回缓存数组<br>                 $result = unserialize(join('', file($cache_file)));<br>                 // 如果缓存不为空,则设置$cached=1<br>                 if ($result) $result['cached'] = 1;<br>             } else {<br>                 // 缓存文件已过期,则创建新的缓存文件<br>                 $result = $this->Parse($rss_url);<br>                 $serialized = serialize($result);<br>                 if ($f = @fopen($cache_file, 'w')) {<br>                     fwrite ($f, $serialized, strlen($serialized));<br>                     fclose($f);<br>                 }<br>                 if ($result) $result['cached'] = 0;<br>             }<br>         }<br>         // 如果未启用缓存,则直接加载文件<br>         else {<br>             $result = $this->Parse($rss_url);<br>             if ($result) $result['cached'] = 0;<br>         }<br>         return $result;<br>     }<br>     <br>     // -------------------------------------------------------------------<br>     // 重定义preg_match(); 返回修正过后的第一个匹配<br>     // from 'classic' preg_match() array output<br>     // -------------------------------------------------------------------<br>     function my_preg_match ($pattern, $subject) {<br>         // 开始正在匹配<br>         preg_match($pattern, $subject, $out);<br> <br>         // 如果结果不为空,则继续<br>         if(isset($out[1])) {<br>             // 处理 CDATA (如果存在)<br>             if ($this->CDATA == 'content') { // 获取 CDATA内容 (不存在 CDATA 标签)<br>                 $out[1] = strtr($out[1], array(''', ']]>'=>''));<br>             } elseif ($this->CDATA == 'strip') { // 去除 CDATA<br>                 $out[1] = strtr($out[1], array(''', ']]>'=>''));<br>             }<br> <br>             //转换成设置的编码<br>             if ($this->cp != '')<br>                 $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]);<br>             return trim($out[1]);<br>         } else {<br>             return '';<br>         }<br>     }<br> <br>     // -------------------------------------------------------------------<br>     // 替换html实体为真实字符<br>     // -------------------------------------------------------------------<br>     function unhtmlentities ($string) {<br>         // Get HTML entities table<br>         $trans_tbl = get_html_translation_table (HTML_ENTITIES, ENT_QUOTES);<br>         // Flip keysvalues<br>         $trans_tbl = array_flip ($trans_tbl);<br>         // Add support for ' entity (missing in HTML_ENTITIES)<br>         $trans_tbl += array(''' => "'");<br>         // Replace entities by values<br>         return strtr ($string, $trans_tbl);<br>     }<br> <br>     // -------------------------------------------------------------------<br>     // Parse() 是由GET()调用的私有方法,用来解析RSS文件.<br>     // 所以不要在你的代码中使用Parse(),而是用 Get($rss_file)方法来替代.<br>     // -------------------------------------------------------------------<br>     function Parse ($rss_url) {<br>         //打开RSS文件<br>         if ($f = @fopen($rss_url, 'r')) {<br>             $rss_content = '';<br>             while (!feof($f)) {<br>                 $rss_content .= fgets($f, 4096);<br>             }<br>             fclose($f);<br> <br>             // 解析文件编码 <br>             $result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content);<br>             //如果文件编码一致则直接使用<br>             if ($result['encoding'] != '')<br>                 { $this->rsscp = $result['encoding']; } // This is used in my_preg_match()<br>             //否则使用默认的编码<br>             else<br>                 { $this->rsscp = $this->default_cp; } // This is used in my_preg_match()<br> <br>             // 解析 CHANNEL信息<br>             preg_match("'<channel.>(.*?)'si", $rss_content, $out_channel);<br>             foreach($this->channeltags as $channeltag)<br>             {<br>                 $temp = $this->my_preg_match("'(.*?)$channeltag>'si", $out_channel[1]);<br>                 if ($temp != '') $result[$channeltag] = $temp; // Set only if not empty<br>             }<br>             // If date_format is specified and lastBuildDate is valid<br>             if ($this->date_format != '' && ($timestamp = strtotime($result['lastBuildDate'])) !==-1) {<br>                         // 解析 lastBuildDate 到指定的时间格式<br>                         $result['lastBuildDate'] = date($this->date_format, $timestamp);<br>             }<br> <br>             // 解析 TEXTINPUT<br>             preg_match("'<textinput>]*[^/])>(.*?)</textinput>'si", $rss_content, $out_textinfo);<br>                 // This a little strange regexp means:<br>                 // Look for tag <textinput> with or without any attributes, but skip truncated version <textinput></textinput> (it's not beggining tag)<br>             if (isset($out_textinfo[2])) {<br>                 foreach($this->textinputtags as $textinputtag) {<br>                     $temp = $this->my_preg_match("'(.*?)$textinputtag>'si", $out_textinfo[2]);<br>                     if ($temp != '') $result['textinput_'.$textinputtag] = $temp; // Set only if not empty<br>                 }<br>             }<br>             // 解析 IMAGE<br>             preg_match("'<image.>(.*?)'si", $rss_content, $out_imageinfo);<br>             if (isset($out_imageinfo[1])) {<br>                 foreach($this->imagetags as $imagetag) {<br>                     $temp = $this->my_preg_match("'(.*?)$imagetag>'si", $out_imageinfo[1]);<br>                     if ($temp != '') $result['image_'.$imagetag] = $temp; // Set only if not empty<br>                 }<br>             }<br>             // 解析 ITEMS<br>             preg_match_all("'<item>(.*?)</item>'si", $rss_content, $items);<br>             $rss_items = $items[2];<br>             $i = 0;<br>             $result['items'] = array(); // create array even if there are no items<br>             foreach($rss_items as $rss_item) {<br>                 // If number of items is lower then limit: Parse one item<br>                 if ($i items_limit || $this->items_limit == 0) {<br>                     foreach($this->itemtags as $itemtag) {<br>                         $temp = $this->my_preg_match("'(.*?)$itemtag>'si", $rss_item);<br>                         if ($temp != '') $result['items'][$i][$itemtag] = $temp; // Set only if not empty<br>                     }<br>                     // Strip HTML tags and other bullshit from DESCRIPTION<br>                     if ($this->stripHTML && $result['items'][$i]['description'])<br>                         $result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description'])));<br>                     // Strip HTML tags and other bullshit from TITLE<br>                     if ($this->stripHTML && $result['items'][$i]['title'])<br>                         $result['items'][$i]['title'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['title'])));<br>                     // If date_format is specified and pubDate is valid<br>                     if ($this->date_format != '' && ($timestamp = strtotime($result['items'][$i]['pubDate'])) !==-1) {<br>                         // convert pubDate to specified date format<br>                         $result['items'][$i]['pubDate'] = date($this->date_format, $timestamp);<br>                     }<br>                     // Item 计数<br>                     $i++;<br>                 }<br>             }<br> <br>             $result['items_count'] = $i;<br>             return $result;<br>         }<br>         else // 文件打开错误返回False<br>         {<br>             return False;<br>         }<br>     }<br> }</image.></textinput></channel.>

AD:真正免费,域名+虚机+企业邮箱=0元

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn