PHP RSS解析器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP RSS解析器相关的知识,希望对你有一定的参考价值。

<?php

if(!defined('BASEPATH'))
    exit('No direct script access allowed');

/*
 * This class is written based entirely on the work found below
 * www.techbytes.co.in/blogs/2006/01/15/consuming-rss-with-php-the-simple-way/
 * All credit should be given to the original author
 */


class RSSParser
{


    // ===================//
    //Instance vars     //
    // ===================//

    /* Feed URI */
    var $feed_uri;

    /* Associative array containing all the feed items */
    var $data;

    /* Store RSS Channel Data in an array */
    var $channel_data;

    /*  Boolean variable which indicates whether an RSS feed was unavailable */
    var $feed_unavailable;

    /* Cache lifetime */
    var $cache_life;

    /* Flag to write to cache - defaulted to false */
    var $write_cache_flag = false;

    /* Code Ignitor cache directory */
    var $cache_dir;



    // ================ //
    // Constructor     //
    // ================ //
    function RSSParser($params)
    {
        $this->CI = & get_instance();
        $this->cache_dir = $this->CI->config->item('rss_cache_path');

        //$this->cache_dir = '/system/cache';
        $this->cache_life = $params['life'];

        $this->feed_uri = $params['url'];
        $this->current_feed['title'] = '';
        $this->current_feed['description'] = '';
        $this->current_feed['link'] = '';
        $this->data = array();
        $this->channel_data = array();

        //Attempt to parse the feed
        $this->parse();
    }



    // =============== //
    // Methods       //
    // =============== //
    function parse()
    {
        //Are we caching?
        if($this->cache_life != 0)
        {

            $filename = $this->cache_dir . 'rss_Parse_' . md5($this->feed_uri);

            //is there a cache file ?
            if(file_exists($filename))
            {
                //Has it expired?
                $timedif = (time() - filemtime($filename));
                if($timedif < ( $this->cache_life * 60))
                {
                    //its ok - so we can skip all the parsing and just return the cached array here
                    $this->xml_to_object(implode('', file($filename)));
                    return true;
                }
                //So raise the falg
                $this->write_cache_flag = true;
            }
            else
            {
                //Raise the flag to write the cache
                $this->write_cache_flag = true;
            }
        }


        //Parse the document
        $rawFeed = file_get_contents($this->feed_uri);
        $this->xml_to_object($rawFeed);

        //Do we need to write the cache file?
        if($this->write_cache_flag)
        {
            if(!$fp = @fopen($filename, 'wb'))
            {
                echo 'ERROR';
                log_message('error', 'Unable to write cache file: ' . $cache_path);
                return;
            }
            flock($fp, LOCK_EX);
            fwrite($fp, $rawFeed);
            flock($fp, LOCK_UN);
            fclose($fp);
        }
        return true;
    }

    /* Return the feeds one at a time: when there are no more feeds return false
     * @param No of items to return from the feed
     * @return Associative array of items
     */



    function getFeed($num)
    {
        $c = 0;
        $return = array();
        foreach($this->data AS $item)
        {
            $return[] = $item;
            $c++;
            if($c == $num)
                break;
        }
        return $return;
    }

    /* Return channel data for the feed */



    function & getChannelData()
    {
        if(!empty($this->channel_data))
        {
            return $this->channel_data;
        }
        else
        {
            return FALSE;
        }
    }

    /* Were we unable to retreive the feeds ?  */



    function errorInResponse()
    {
        return $this->feed_unavailable;
    }



    function xml_to_object($feed)
    {
        $xml = new SimpleXmlElement($feed);

        //Assign the channel data
        $this->channel_data['title'] = $xml->channel->title;
        $this->channel_data['description'] = $xml->channel->description;
        $this->channel_data['lastBuildDate'] = $xml->channel->lastBuildDate;

        //Build the item array
        foreach($xml->channel->item as $item)
        {
            $data = array();
            $data['title'] = $item->title;
            $data['description'] = $item->description;
            $data['pubDate'] = $item->pubDate;
            $data['link'] = $item->link;
            $this->data[] = $data;
        }

        //return $this->data;
    }

}

以上是关于PHP RSS解析器的主要内容,如果未能解决你的问题,请参考以下文章

Python中的RSS提要解析器库[关闭]

Python中的RSS提要解析器库[关闭]

CBC世界新闻RSS解析器

解析 XML(RSS 提要)的 PHP 错误

在 PHP 中解析 RSS2

Twitter RSS提要解析器,用于在网站上显示tweet(包括缓存)