Heim > Backend-Entwicklung > PHP-Tutorial > RSS 20 PHP-Generierungsklasse, schnelle Lesegenerierung erfordert XML-Datei

RSS 20 PHP-Generierungsklasse, schnelle Lesegenerierung erfordert XML-Datei

WBOY
Freigeben: 2016-07-29 09:13:18
Original
854 Leute haben es durchsucht

Die RSS 2.0-Version der im Projekt verwendeten PHP-Generierungsklasse.

Sie müssen nur die Daten entsprechend der Datenstruktur eingeben, um eine XML-Datei zu generieren und diese über die Funktion auszugeben.

/**
 * 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);
        }
    }
}
Nach dem Login kopieren

Ändern Sie bei der Verwendung die verschiedenen darin enthaltenen Konstanten in die von Ihnen benötigten Parameter und verwenden Sie sie dann wie folgt, um den Standard-RSS-Code auszugeben.

Dieses Programm verwendet den lokalen Umgebungszeichensatz von GBK. Wenn Ihre lokale Umgebung UTF-8 ist, ändern Sie bitte diesen Code 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();
Nach dem Login kopieren

Das Obige stellt die PHP-Generierungsklasse RSS 20 vor, für die eine schnelle Lesegenerierung erforderlich ist, einschließlich unternehmerischer Inhalte. Ich hoffe, dass sie für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Verwandte Etiketten:
gt lt
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 Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage