用 PHP 解析 RSS/Atom 提要的最佳方法

我目前使用的是 喜鹊 RSS,但当 RSS 或 Atom 提要格式不正确时,它有时会崩溃。还有其他用 PHP 解析 RSS 和 Atom 提要的选项吗?

162378 次浏览

我使用 傻瓜解析谷歌阅读器提要,它工作得非常好,有一个不错的功能集。

当然,我还没有用非格式化的 RSS/Atom 提要测试过它,所以我不知道它是如何处理这些的,我假设 Google 的提要是相当符合标准的!:)

HTMLTidy 库能够修复一些格式不正确的 XML 文件。在将提要传递给解析器之前通过它运行它们可能会有所帮助。

我一直使用 PHP 内置的 SimpleXML 函数来解析 XML 文档。它是为数不多的具有直观结构的通用解析器之一,这使得为特定内容(如 RSS 提要)构建有意义的类变得非常容易。此外,它将检测 XML 警告和错误,一旦发现任何错误,您可以简单地通过类似 HTML Tidy (正如 ceejayoz 提到的)运行源代码来清理它并再次尝试。

考虑一下这个使用 SimpleXML 的非常粗略、简单的类:

class BlogPost
{
var $date;
var $ts;
var $link;


var $title;
var $text;
}


class BlogFeed
{
var $posts = array();


function __construct($file_or_url)
{
$file_or_url = $this->resolveFile($file_or_url);
if (!($x = simplexml_load_file($file_or_url)))
return;


foreach ($x->channel->item as $item)
{
$post = new BlogPost();
$post->date  = (string) $item->pubDate;
$post->ts    = strtotime($item->pubDate);
$post->link  = (string) $item->link;
$post->title = (string) $item->title;
$post->text  = (string) $item->description;


// Create summary as a shortened body and remove images,
// extraneous line breaks, etc.
$post->summary = $this->summarizeText($post->text);


$this->posts[] = $post;
}
}


private function resolveFile($file_or_url) {
if (!preg_match('|^https?:|', $file_or_url))
$feed_uri = $_SERVER['DOCUMENT_ROOT'] .'/shared/xml/'. $file_or_url;
else
$feed_uri = $file_or_url;


return $feed_uri;
}


private function summarizeText($summary) {
$summary = strip_tags($summary);


// Truncate summary line to 100 characters
$max_len = 100;
if (strlen($summary) > $max_len)
$summary = substr($summary, 0, $max_len) . '...';


return $summary;
}
}

如果 feed 不是格式良好的 XML,应该拒绝它,没有例外。

否则,您将为 HTML 最终出现的混乱铺平道路。

我个人使用 BNC 高级饲料解析器-我喜欢的模板系统,是非常容易使用

对于4行,我将一个 rss 导入到一个数组中。

$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

更复杂的解决方案

$feed = new DOMDocument();
$feed->load('file.rss');
$json = array();
$json['title'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
$json['description'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
$json['link'] = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('link')->item(0)->firstChild->nodeValue;
$items = $feed->getElementsByTagName('channel')->item(0)->getElementsByTagName('item');


$json['item'] = array();
$i = 0;


foreach($items as $key => $item) {
$title = $item->getElementsByTagName('title')->item(0)->firstChild->nodeValue;
$description = $item->getElementsByTagName('description')->item(0)->firstChild->nodeValue;
$pubDate = $item->getElementsByTagName('pubDate')->item(0)->firstChild->nodeValue;
$guid = $item->getElementsByTagName('guid')->item(0)->firstChild->nodeValue;


$json['item'][$key]['title'] = $title;
$json['item'][$key]['description'] = $description;
$json['item'][$key]['pubdate'] = $pubDate;
$json['item'][$key]['guid'] = $guid;
}


echo json_encode($json);

另一个伟大的免费解析器—— http://bncscripts.com/free-php-rss-parser/ 它非常轻(只有3kb)和简单的使用!

我想介绍一个解析 RSS 的简单脚本:

$i = 0; // counter
$url = "http://www.banki.ru/xml/news.rss"; // url to parse
$rss = simplexml_load_file($url); // XML parser


// RSS items loop


print '<h2><img style="vertical-align: middle;" src="'.$rss->channel->image->url.'" /> '.$rss->channel->title.'</h2>'; // channel title + img with src


foreach($rss->channel->item as $item) {
if ($i < 10) { // parse only 10 items
print '<a href="'.$item->link.'">'.$item->title.'</a><br />';
}


$i++;
}

PHP RSS 阅读器 http://www.scriptol.com/rss/rss-reader.php是一个完整而简单的解析器,被成千上万的用户使用..。