PHP解析读取gridea静态博客RSS整合到网站首页

最近在更新typecho个人网站和gridea静态博客,需要在网站首页展现博客的动态,因为Gridea静态博客,没有数据库,前期都是手工将博客的标题和链接添加到网站的首页,今天启用了博客的RSS聚合系统,可以通过RSS实现博客同步调用,于是,自己动手使用PHP解析读取博客网站的RSS,实现了博客的文章同步。

什么是 RSS?

RSS 指 Really Simple Syndication(真正简易联合)
RSS 使您有能力聚合(syndicate)网站的内容
RSS 定义了非常简单的方法来共享和查看标题和内容
RSS 文件可被自动更新
RSS 允许为不同的网站进行视图的个性化
RSS 使用 XML 编写

为什么使用 RSS?

RSS 被设计用来展示选定的数据。
如果没有 RSS,用户就不得不每日都来您的网站检查新的内容。对许多用户来说这样太费时了。通过 RSS feed(RSS 通常被称为 News feed 或 RSS feed),用户们可以使用 RSS 聚合器来更快地检查您的网站更新(RSS 聚合器是用来聚集并分类 RSS feed 的网站或软件)。
由于 RSS 数据很小巧并可快速加载,它可轻易地被类似移动电话或 PDA 的服务使用。
拥有相似内容的网站环(Web-rings)可以轻易地在它们的网站共享内容,使这些网站更出色更有价值。

我的博客的RSS

我的博客的RSS输出如下:

<feed xmlns="http://www.w3.org/2005/Atom">
<id/>
<title>hoochon's blog</title>
<updated>2020-05-16T14:22:14.655Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href=""/>
<link rel="self" href="/atom.xml"/>
<subtitle>温故而知新</subtitle>
<logo>/images/avatar.png</logo>
<icon>/favicon.ico</icon>
<rights>All rights reserved 2020, hoochon's blog</rights>
<entry>
<title type="html">
<![CDATA[ typecho博客阅读页文章段落之间添加广告代码 ]]>
</title>
<id>/post/202005148002ee68e926c500/</id>
<link href="/post/202005148002ee68e926c500/"> </link>
<updated>2020-05-14T00:15:56.000Z</updated>
<summary type="html">
<![CDATA[
<p>近期给网站部署广告,在首页,侧栏、阅读页面部署广告都比较相对来说比较简单,那么如何在typecho文章页文章第几段文字后,添加广告代码呢?</p>
]]>
</summary>
<content type="html">
<![CDATA[
<p>近期给网站部署广告,在首页,侧栏、阅读页面部署广告都比较相对来说比较简单,那么如何在typecho文章页文章第几段文字后,添加广告代码呢?</p>
]]>
</content>
</entry>
<entry>
<title type="html">
<![CDATA[ 百度站长工具链接提交主动推送(实时)PHP推送教程 ]]>
</title>
<id>/post/20200512d509d9aad14443b7/</id>
<link href="/post/20200512d509d9aad14443b7/"> </link>
<updated>2020-05-12T09:37:24.000Z</updated>
<summary type="html">
<![CDATA[
<p>百度站长工具的链接提交方式之一,“主动推送(实时)”提交方式可以向百度搜索引擎实时推送网站的最新网址URL。当网站新增新的文章后,我们可以第一时间向百度引擎推送和提交链接,百度可能会马上收录。结合百度官方给的实例,下面是详细“php推送示例”教程:</p>
]]>
</summary>
<content type="html">
<![CDATA[
<p>百度站长工具的链接提交方式之一,“主动推送(实时)”提交方式可以向百度搜索引擎实时推送网站的最新网址URL。当网站新增新的文章后,我们可以第一时间向百度引擎推送和提交链接,百度可能会马上收录。结合百度官方给的实例,下面是详细“php推送示例”教程:</p>
]]>
</content>
</entry>
<entry>...</entry>
<entry>...</entry>
...
mark

整合解析效果

mark

PHP解析代码

<?php
//解决PHP显示Warning和Notice等问题
ini_set("display_errors", 0);
error_reporting(E_ALL ^ E_NOTICE);
error_reporting(E_ALL ^ E_WARNING);

//RSS源地址列表数组
$rssurl ="http://blog.zyglz.com/atom.xml";
//设置编码为UTF-8
Header('content-type:text/html;Charset=utf-8');

$buff = "";
//用来输出拼接字符串
$rss_str = "";
//逻辑控制
$is_item=0;
//打开rss地址,并读取,读取失败则中止
$fp = fopen($rssurl, "r") or die("无法打开该网站Feed");
while (!feof($fp)) {
	$buff .= fgets($fp, 4096);
}
//关闭文件打开
fclose($fp);

//建立一个 XML 解析器
$parser = xml_parser_create();
//xml_parser_set_option -- 为指定 XML 解析进行选项设置
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
//xml_parse_into_struct -- 将 XML 数据解析到数组$values中
xml_parse_into_struct($parser, $buff, $values, $idx);
//xml_parser_free -- 释放指定的 XML 解析器
xml_parser_free($parser);

foreach ($values as $val) {
	$tag = $val["tag"];
	$type = $val["type"];
	$value = $val["value"];
	//转换为小写,方便后面进行判断
	$tag = strtolower($tag);

	if ($is_item==1) {
		//博文title
		if ($tag=='title') {$title=$value;}
		//博文链接,这里需要拼接
		if ($tag=='id') {$link='http://blog.zyglz.com' . $value;}
		//博文发布时间,这里需要截取
		if ($tag=='updated') {$dt=substr($value,0,10);}
		//博文摘要
		if ($tag=='summary') {$desc=$value;}
	}

	if ($tag == 'entry' && $type == 'open') {
		$is_item = 1;
	} elseif ($tag == 'entry' && $type =='close') {
		//构造输出字符串
		$rss_str .= '<a href="' . $link . '" target=_blank>' . $title .'('.$dt. ')</a><br />';
		$is_item = 0;
	}
}

//输出拼接结果
echo $rss_str . '<br/>';

?>

数据整合

将博客的RSS数据整合到个人网站的首页,这里就不书写代码了,根据个人的网站主题,对刚刚的解析读取到的数据进行美化即可,我的整合如下:
mark