Beste Möglichkeit, RSS / Atom-Feeds mit PHP zu analysieren [geschlossen]
135
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?
Es gibt ein Problem mit dieser Anfrage. Die meisten Feed-Reader verwenden die Kern-XML-Reader von PHP. Wenn das XML nicht gemäß den XML-Standards gut formatiert ist, fällt es um. Sie können sich diejenigen ansehen, die keine XML-Reader verwenden, und a verwenden Text Reader Die Belastung des Servers wird jedoch dramatisch zunehmen. Ich weiß, dass dies beantwortet wird. Ich mache die Leute nur auf die Nachteile der Verwendung von XML-Feed-Readern aufmerksam
Barkermn01
1
Versuchen Sie niemals, ungültiges XML zu analysieren. Beschuldige die Quelle.
Ich mag solche "Antworten" nicht und gebe Links ohne Kommentare. Sieht so aus, als würden Sie es googeln und auf einige Top-Ergebnisse verlinken. Zumal der Fragesteller über RSS-Erfahrung verfügt und einen besseren Parser benötigt.
Dualität_
3
Für den Fall, dass jemand ein wenig Rat braucht, ist Last RSS das einfachste unter den drei oben aufgeführten. Nur 1 Datei "erforderlich", und kann das RSS innerhalb von 5 Zeilen mit einer anständigen Array-Ausgabe abrufen.
Ich habe zwei davon verwendet und LastRss scheint nicht gut genug zu sein, um einen voll funktionsfähigen Helfer bereitzustellen, und SimplePie ist etwas zu kompliziert. Ich würde gerne andere ausprobieren, aber Kommentare zu diesen Bibliotheken sind für die Leute besser zu verstehen, nicht nur für Links.
Noob
169
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:
classBlogPost{var $date;var $ts;var $link;var $title;var $text;}classBlogFeed{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 =newBlogPost();
$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;}}privatefunction 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;}privatefunction 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;}}
Nun, ich hatte eines, aber es wurde von SOs Code-Formatierer gegessen, da es keine leere Zeile darüber hatte. In einem ähnlichen Zusammenhang haben Sie Ihren Satz nicht mit einem Großbuchstaben begonnen. ;)
Brian Cline
4
Bitte wechseln Sie $feed_uri = $feed_or_url;zu $feed_uri = $file_or_url;... anders als das, danke für diesen Code! Es funktioniert super!
Tim
5
Beachten Sie, dass diese Lösung zwar großartig ist, jedoch nur RSS-Feeds in der aktuellen Form analysiert. Atom-Feeds werden aufgrund ihres unterschiedlichen Schemas nicht analysiert.
András Szepesházi
9
Beachten Sie, dass dies eregi_replacejetzt veraltet ist und sowohl durch preg_replaceals auch eregidurch ersetzt wurde preg_match. Dokumentationen finden Sie hier bzw. hier .
Kannst du mir den RSS-Feed geben, den du verwendest?
Juni
2
Für den Fall, dass Sie sich fragen. Es sieht so aus, als würde er einen Tumblr-RSS-Feed verwenden. Anytumblrsite.com/rss würde Ihnen die gleiche Ausgabe geben.
Andrewk
3
Habe die 4 Zeilen benutzt, habe einen tollen Job gemacht :) aber dann habe ich die 1. Zeile umgeschrieben: ist $feed = file_get_contents('http://yourdomains.com/feed.rss');vielleicht weniger intensiv als file + implode
+1, Sie sollten nicht versuchen, XML zu umgehen, das nicht gut geformt ist. Wir haben schlechte Erfahrungen mit ihnen gemacht, vertrau mir, es war ein großer Schmerz :(
Helen Neely
35
Programmierer können jedoch keine Geschäftspartner auswählen und müssen analysieren, was ihnen gegeben wird.
Edmond Meinfelder
2
Was ist, wenn Sie einen universellen RSS / Atom-Feed-Reader bauen? Wenn eine schlecht geformte XML-Datei Ihren HTML-Code "durcheinander bringen" kann, wer ist der Bozo? ;) Sei liberal in dem, was du erhältst.
yPhil
6
Die HTML Tidy-Bibliothek kann einige fehlerhafte XML-Dateien reparieren. Es kann hilfreich sein, Ihre Feeds zu durchlaufen, bevor Sie sie an den Parser weiterleiten.
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! :) :)
Antworten:
Ihre anderen Optionen umfassen:
quelle
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:
quelle
$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 durchpreg_replace
als aucheregi
durch ersetzt wurdepreg_match
. Dokumentationen finden Sie hier bzw. hier .Mit 4 Zeilen importiere ich ein RSS in ein Array.
Für eine komplexere Lösung
quelle
$feed = file_get_contents('http://yourdomains.com/feed.rss');
vielleicht weniger intensiv als file + implodeIch möchte ein einfaches Skript zum Parsen von RSS einführen:
quelle
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.
quelle
Die HTML Tidy-Bibliothek kann einige fehlerhafte XML-Dateien reparieren. Es kann hilfreich sein, Ihre Feeds zu durchlaufen, bevor Sie sie an den Parser weiterleiten.
quelle
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! :) :)
quelle
Persönlich verwende ich BNC Advanced Feed Parser - ich mag das Vorlagensystem, das sehr einfach zu bedienen ist
quelle
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 ...
quelle
Ein weiterer großartiger kostenloser Parser - http://bncscripts.com/free-php-rss-parser/ Es ist sehr leicht (nur 3 KB) und einfach zu bedienen!
quelle