Ich verwende derzeit Magpie RSS, aber es fällt manchmal um, wenn der RSS- oder Atom-Feed nicht gut geformt ist. Gibt es andere Optionen zum Parsen von RSS- und Atom-Feeds mit PHP?
Ich verwende derzeit Magpie RSS, aber es fällt manchmal um, wenn der RSS- oder Atom-Feed nicht gut geformt ist. Gibt es andere Optionen zum Parsen von RSS- und Atom-Feeds mit PHP?
Antworten:
Ihre anderen Optionen umfassen:
Ich habe immer die in PHP integrierten SimpleXML-Funktionen verwendet , um XML-Dokumente zu analysieren. Es ist einer der wenigen generischen Parser, der eine intuitive Struktur aufweist, die es extrem einfach macht, eine aussagekräftige Klasse für etwas Bestimmtes wie einen RSS-Feed zu erstellen. Darüber hinaus werden XML-Warnungen und -Fehler erkannt. Wenn Sie eine finden, können Sie die Quelle einfach über HTML Tidy (wie von ceejayoz erwähnt) ausführen, um sie zu bereinigen und erneut zu versuchen.
Betrachten Sie diese sehr grobe, einfache Klasse mit 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_uri = $feed_or_url;
zu $feed_uri = $file_or_url;
... anders als das, danke für diesen Code! Es funktioniert super!
eregi_replace
jetzt veraltet ist und sowohl durch preg_replace
als auch eregi
durch ersetzt wurde preg_match
. Dokumentationen finden Sie hier bzw. hier .
Mit 4 Zeilen importiere ich ein RSS in ein Array.
$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Für eine komplexere Lösung
$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);
$feed = file_get_contents('http://yourdomains.com/feed.rss');
vielleicht weniger intensiv als file + implode
Ich möchte ein einfaches Skript zum Parsen von RSS einführen:
$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++;
}
Wenn Feed kein wohlgeformtes XML ist, sollten Sie es ausnahmslos ablehnen. Sie haben das Recht, den Feed-Ersteller als Bozo zu bezeichnen .
Andernfalls ebnen Sie den Weg, um das HTML in Unordnung zu bringen.
Ich benutze SimplePie , um einen Google Reader-Feed zu analysieren. Er funktioniert ziemlich gut und verfügt über einen anständigen Funktionsumfang.
Natürlich habe ich es nicht mit nicht gut geformten RSS / Atom-Feeds getestet, daher weiß ich nicht, wie es damit umgeht. Ich gehe davon aus, dass Google ziemlich standardkonform ist! :) :)
Der PHP-RSS-Reader - http://www.scriptol.com/rss/rss-reader.php - ist ein vollständiger, aber einfacher Parser, der von Tausenden von Benutzern verwendet wird ...
Ein weiterer großartiger kostenloser Parser - http://bncscripts.com/free-php-rss-parser/ Es ist sehr leicht (nur 3 KB) und einfach zu bedienen!