RSS 20 PHP 생성 클래스, 빠른 읽기 생성에는 xml 파일이 필요합니다.

WBOY
풀어 주다: 2016-07-29 09:13:18
원래의
829명이 탐색했습니다.

프로젝트에 사용된 PHP 생성 클래스의 RSS 2.0 버전입니다.

XML 파일을 생성하려면 데이터 구조에 따라 데이터를 입력하고 함수를 통해 출력하기만 하면 됩니다.

/**
 * Rss生成模块
 * @author JerryLi (@lijian@dzs.mobi)
 * @see 协议说明 RSS规范遵循 2.0
 *   http://jyjsjd.iteye.com/blog/1543483
 *   http://rayleeya.iteye.com/blog/372802
 */
final class CRssBuilder{
    /**
     * 本地字符集
     * @var string
     */
    const LOCAL_CHARSET = 'gbk';
    /**
     * 语言
     * @var string
     */
    const LANGUAGE = 'zh-cn';
    /**
     * RSS所有者
     * @var string
     */
    const GENERATOR = 'www.csdn.net';
    /**
     * 板块通道
     * @var array
     */
    private $_aChannel = null;
    /**
     * 构造函数
     * @param string $aChannel 频道属性
     * <li>array('title'=>'频道标题', 'description'=>'频道摘要', 'link'=>'本频道URL地址')</li>
     */
    public function __construct($aChannel){
        header('Content-Type:text/xml; charset=UTF-8'); //必须输出标准的xml头
        $this->_aChannel = array('channel'=>$aChannel, 'items'=>array());
    }
    /**
     * 析构函数
     */
    public function __destruct(){
    }
    /**
     * 在通道内添加子项目
     * @param int $iChannelId 通道ID(即:addChannel())
     * <li>array('title'=>'标题','link'=>'文章的URL地址', 'description'=>'文章摘要','category'=>'栏目名称','utc_timestemp'=>'发布时间')</li>
     * @return int item的数量
     */
    public function addItems($aParam){
        $this->_aChannel['items'][] = $aParam;
        return count($this->_aChannel['items']);
    }
    /**
     * 将内容序列化成rss的xml结构数据字符串
     * @return string | null
     */
    public function getSerialize(){
        static $sTemplateChannel = null;
        static $sTemplateItem = null;
        if (empty($sTemplateChannel) || empty($sTemplateItem)){
            $aTmp = array();
            $aTmp[] = ' <channel>';
            $aTmp[] = '  <language>'. self::LANGUAGE .'</language>';
            $aTmp[] = '  <generator>'. self::GENERATOR .'</generator>';
            $aTmp[] = '  <ttl>'. (60 * 24) .'</ttl>'; //更新时间为24小时
            $aTmp[] = '  <pubDate>'. gmdate("D, d M Y 23:59:59", time()) .' GMT</pubDate>'; //当前RSS最后发布的时间
            $aTmp[] = '  <title><![CDATA[{@channel_title}]]></title>';
            $aTmp[] = '  <link><![CDATA[{@channel_link}]]></link>';
            $aTmp[] = '  <description><![CDATA[{@channel_description}]]></description>';
            $aTmp[] = '{@item}';
            $aTmp[] = ' </channel>';
            $sTemplateChannel = implode("\n", $aTmp);
            unset($aTmp);

            $aTmp = array();
            $aTmp[] = '  <item>';
            $aTmp[] = '   <title><![CDATA[{@item_title}]]></title>';
            $aTmp[] = '   <link>{@item_link}</link>';
            $aTmp[] = '   <description><![CDATA[{@item_description}]]></description>';
            $aTmp[] = '   <category><![CDATA[{@item_category}]]></category>';
            $aTmp[] = '   <guid><![CDATA[{@item_link}]]></guid>';
            $aTmp[] = '   <pubDate>{@item_pubdate}</pubDate>'; //文章发布时间
            $aTmp[] = '  </item>';
            $sTemplateItem = implode("\n", $aTmp);
            unset($aTmp);
        }

        if (!empty($this->_aChannel)){
            $aTmpItem = array();
            foreach ($this->_aChannel['items'] as $aItem){ //内层遍历item
                $aParam = array(
                    '{@item_title}'=> self::convert_encoding($aItem['title'], self::LOCAL_CHARSET),
                    '{@item_link}'=> $aItem['link'],
                    '{@item_description}'=> self::convert_encoding($aItem['description'], self::LOCAL_CHARSET),
                    '{@item_category}'=> self::convert_encoding($aItem['category'], self::LOCAL_CHARSET),
                    '{@item_pubdate}'=> gmdate("D, d M Y 23:59:59", $aItem['utc_timestemp']) .' GMT',
                );
                $aTmpItem[] = strtr($sTemplateItem, $aParam);
                unset($aParam);$aParam=null;
            }

            $aParam = array(
                '{@channel_title}'=> self::convert_encoding($this->_aChannel['channel']['title'], self::LOCAL_CHARSET),
                '{@channel_link}'=> $this->_aChannel['channel']['link'],
                '{@channel_description}'=> self::convert_encoding($this->_aChannel['channel']['description'], self::LOCAL_CHARSET),
                '{@item}'=> implode("\n", $aTmpItem),
            );

            $aOutBuf = array();
            $aOutBuf[] = '<?xml version="1.0" encoding="utf-8" ?>';
            $aOutBuf[] = '<rss version="2.0">';
            $aOutBuf[] = strtr($sTemplateChannel, $aParam);;
            unset($aParam);$aParam=null;
            $aOutBuf[] = '</rss>';
            return implode("\n", $aOutBuf);
        }else{
            return null;
        }
    }
    /**
     * 对变量内容的进行字符编码转换
     * @param string $sInCharset 转换前的字符集
     * @param string $sOutCharset 转换后的字符集
     * @param string | array $mixd 待转换的变量(数组或字符串)
     * @return string | array 完成转换后的结果
     */
    static public function convert_encoding(& $mixd, $sInCharset, $sOutCharset='utf-8') {
        if ($sInCharset === $sOutCharset) //字符集相同时不转换
            return $mixd;

        if (is_array($mixd)) {
            $tmp = array();
            foreach ($mixd as $key => $val) {
                $tmp[$key] = self::convert_encoding($sInCharset, $sOutCharset, $val);
            }
            return $tmp;
        } else { //字符集相同时不转换
            return mb_convert_encoding($mixd, $sOutCharset, $sInCharset);
        }
    }
}
로그인 후 복사

사용시 내부의 여러 상수를 필요한 매개변수로 수정한 후 다음과 같이 사용하여 표준 RSS 코드를 출력합니다.

이 프로그램은 GBK의 로컬 환경 문자 집합을 사용합니다. 로컬 환경이 UTF-8인 경우 이 코드를 수정하세요. LOCAL_CHARSET = 'gbk';

/*测试用例*/
$aChannel = array('title'=>'每周精选','description'=>'二手车最新新闻','link'=>'http://www.chemao.com.cn/baike-gonglue.html');
$o = new CRssBuilder($aChannel);
$aItem = array(
    'title'=>'迎接Baby ,上车猫网甜蜜选购心仪POLO',
    'link'=>'http://www.chemao.com.cn/baike/cwpolo.html',
    'description'=>'我和老公相恋于大学,都是北方人。因为家里适合自己的就业机会少,毕业后两人一起来到杭州发展。拼搏了两年,去年7月我们终于结束了5年的爱情长跑,在西子湖畔与亲友一起见证了我们的爱情。',
    'category'=>'每周精选',
    'utc_timestemp'=>time()
);
$o->addItems($aItem);
$aItem = array(
    'title'=>'为满足空间需求,买个二手MPV可还行!',
    'link'=>'http://www.chemao.com.cn/baike/esmpv.html',
    'description'=>'随着二胎政策与全民<strong>创业</strong>的逐步兴起,路面上跑的MPV越来越多,此类车型的强大用途已经让很多人爱不释手。而金九银十的到来不仅令新车优惠越来越大,二手车价格也在急剧跳水,这其中MPV的价格更是”一贬再贬“,对于想入手这类车型的网友来说,现在下手是绝好时机!下面,下面就为大家推荐几款二手车市场常见的热门MPV。',
    'category'=>'每周精选',
    'utc_timestemp'=>time()
);
$o->addItems($aItem);
echo $o->getSerialize();
로그인 후 복사

위 내용은 RSS 20 PHP 생성 클래스를 소개하고 있습니다. 빠른 읽기 생성에는 창업 콘텐츠를 포함한 xml 파일이 필요합니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되길 바랍니다.

관련 라벨:
gt lt
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿