RSS-Feeds mit PHP auslesen
Nachfolgend ein kleiner Codeschnipsel, wie man einen RSS-Feed mit PHP ausliest. Mit dem gleichen Code sind auch die “Hartware News” in der Sidebar ganz unten auf der Startseite meines Blogs realisiert. Die Ausgabe könnt ihr natürlich mit HTML formatieren und an euer Design anpassen.
// Feed einlesen
if( !$xml = simplexml_load_file('http://www.hartware.net/xml/news.rdf') ) {
die('Fehler beim Einlesen der XML Datei!');
}
// Ausgabe Array
$out = array();
// auszulesende Datensaetze
$i = 5;
// Items vorhanden?
if( !isset($xml->channel[0]->item) ) {
die('Keine Items vorhanden!');
}
// Items holen
foreach($xml->channel[0]->item as $item) {
if( $i-- == 0 ) {
break;
}
$out[] = array(
'title' => (string) $item->title,
'description' => (string) $item->description,
'link' => (string) $item->guid,
'date' => date('d.m.Y H:i', strtotime((string) $item->pubDate))
);
}
// Eintraege ausgeben
foreach ($out as $value) {
echo $value['title'].$value['description'].$value['link'];
}
Sie sehen gerade einen Platzhalterinhalt von X. Um auf den eigentlichen Inhalt zuzugreifen, klicken Sie auf die Schaltfläche unten. Bitte beachten Sie, dass dabei Daten an Drittanbieter weitergegeben werden.
Mehr Informationen
Probleme mit dem Zeichensatz, oder was soll bitte “->” “=>” im Code bedeuten?
Gruß Sylar
Danke für den Hinweis. Der Editor hat die >-Zeichen selbst in HTML-Schreibweise geändert.
Finde den Code sehr hilfreich, Danke nochmal!
Ich bin mit Arrays noch nicht so vertraut. Eigentlich möchte ich eine RSS Feed auslesen und einen einzigen per Zufall ausgeben. Doch ich weiß nicht wo ich da ansetzen soll.
Ist im Prinzip ganz einfach. Bis zur Ausgabe kannst du meinen Code fast identisch übernehmen. Lediglich die Feed-URL und die Anzahl der in Frage kommenden Einträge musst du anpassen.
Die Ausgabe erfolgt dann mit Hilfe einer Zufallszahl, die du ggf. auch anpassen musst, damit sie zu “$i” passt.
[php]
// Eintraege ausgeben
$zufall = rand(0,9);
echo ‘<a href="’.$out[$zufall][‘link’].’">’.$out[$zufall][‘title’].'</a>
<br />’.$out[$zufall][‘description’];[/php]
Hallo Tobi,
herzlichen Dank, das hat mir jede Menge suchen und ausprobieren erspart.
Eine Frage hätte ich noch. Kann ich vorher feststellen wieviel Feeds sich in der XML Datei befinden um $i und random Zahl danach anzupassen?
Ich weiß nicht was passiert wenn ich 10 lade und per zufall einen von 10 ausgebe, wenn sich in einer RSS Datei nur 2 Artikel befinden. Ich hoffe du kannst mir folgen ;)
Gruß Sylar
Ein kurzer Test mit $i = 100 und einem RSS-Feed mit 15 Artikeln hat ergeben, dass alle 15 Artikel geladen werden und keine Fehlermeldung erscheint.
Du könntest dann z.B. in der ersten foreach-Schleife eine Zählvariable hochzählen, und dann diese Variable beim Erstellen der Zufallszahl nutzen.
[php]// Items holen
$count = 0;
foreach($xml->channel[0]->item as $item) {
$count++;
…
$zufall = rand(0,$count);[/php]
Scheint zu funktionieren, vielen Dank für deine Hilfe.
Es kommt zwar vor das er als Link die URL der RSS Datei anzeigt und nicht des RSS Feeds, aber den Fehler muss ich wohl selber suchen.
Danke Tobi
Seltsam. Falls du nicht weiterkommst, kannst du mir gerne deine PHP Datei per Mail (Adresse steht im Impressum) zusenden, dann schau ich mir das an!
hey, danke für den code, gut geeignet um die vorgehensweise zu verstehen.
nur verstehe ich nicht warum du mit zeile 23 nochmal den description-inhalt vorm < abschneidest?!
kannst du das kurz erklären, wäre super :)
Gute Frage ;-) Da der Code schon älter ist, weiß ich nicht mehr was ich mir dabei gedacht habe.
Da es aber auch ohne Zeile 23 funktioniert habe ich den Code im Beitrag entsprechend angepasst. Danke für den Hinweis!
Auch ich mag mich an dieser Stelle einmal bedanken. Ich nutze den Code nun schon das zweite mal – leicht modifiziert. Ich gebe noch eine Formatierung für die Überschrift und den Textabsatz hinzu. Aktuell, um meinen Blog in einen Tab (bzw. ein APP) einer Facebook-FanPage (https://www.facebook.com/wellseo/app_459664944073037) zu bringen. Werde nun noch schauen, das ich ein Artikelbild zusätzlich auslese – und dann ist es ja perfekt.
Danke nochmals und sei gegrüßt!
Guten Abend,
ähm, ich rufe gerade einen online Shop ins leben, und möchte cvs datein über feed einspielen, brauche son code dann für den shop der die daten täglich abrufen kann. ich habe keine ahnung was ich machen muss, – ich google seid stunden finde nichts.
hast du vielleicht einen tipp? lg anke
Nein sorry. Verstehe auch nicht genau was du meinst. Kannst mir gerne eine Mail mit genaueren Infos schreiben.
Vielen Dank für den Code! Der hat mir auch einiges an suchen uns ausprobieren erspart!
Eine Frage habe ich aber noch: Wie kann ich zusätzlich die URL eines Bildes des Feed-Eintrages auslesen?
Mit meinem Schuss ins Blaue..
‘image’ => (string) $item->image,
und dann dem Versuch des auslesens mittels
hatte ich keinen Erfolg :-)
Weisst du wie ich da vorgehen muss?
Vielen Dank & Gruss
Dominic
oh, da ging der HTML-Teil logischerweise verloren :-)
also Nachtrag:
“und dann dem Versuch des auslesens mittels”, achtung jetzt kommt’s:
img src = $value[‘image’]
Bilder werden meist als HTML-Code im Content-Item ausgegeben. Du musst dein Array also um folgenden Eintrag erweitern:
Darin musst du das Bild dann wohl manuell herausfiltern.
Hallo Tobi,
vielen Dank für das super Script! Genau so etwas habe ich gesucht. :)
Jetzt bin ich leider eine Niete was PHP angeht und würde gerne noch die utf-8 Zeichencodierung von dem Script erkennen lassen. Nur leider klappts bei mir nicht.
Hast du nicht noch nen Tipp? :)
Hallo Tobi,
vielen Dank für dein Script. Genau so etwas habe ich gesucht.
Wenn ich die Zeilen 1-3 in mein Programm einbaue erscheint folgende Fehlermeldung:
I/O warning : failed to load external entity “www.hartware.net/xml/news.rdf”
Wäre dankbar für eine Rückmeldung.
lg
Raimund
Ich denke in diesem Artikel habe ich deine Frage beantwortet ;-)
Hallo Tobi,
danke für dieses tolle Script. Ich hoffe du gibst noch support dafür.
Ist es auch möglich das nur Artikel angezeigt werden die in den letzten zb. 6 Stunden erstellt wurden?
Quasi eine if else Anweisung?
if (pub date > aktuelle Uhrzeit -6Stunden)
echo $value[‘description’]
else echo Keine Einträge
Ich hoffe es war soweit verständlich was gemeint ist.
Freue mich auf eine Antwort
Hallo Dennis, nein leider nicht. Der Artikel ist fast neun Jahre alt. Deine Anforderung ist aber kein Problem und du bist schon auf dem richtigen Weg!
Danke Tobi für deine schnelle Antwort.
Der Weg ist schonmal gut. Bei mir hängt es aber dann mit der Umsetzung. Ich versuche es schon den ganzen Tag. 😅
Kannst du mir dennoch einen Lösungsansatz geben? Auch wenn du keinen Support mehr dafür gibst? 🙏
Dann musst du wohl deine PHP-Kenntnisse aufbessern ;-)
Ganz quick’n dirty ohne Gewähr:
Im Array die Zeile ‘date” mit folgender austauschen:
Und unten folgendes:
Hallo,
danke für dieses tolle Script.
Ich habe array Date in folgendes angepasst:
‘date’ => date(‘l, d.m.Y H:i’, strtotime((string) $item->pubDate))
Bekomme aber den Tag in Englisch. Ist es machbar, dass der Tag im Deutschen Format angezeigt wird?
Ich würde mich über eine Antwort freuen.
LG
Michi
Folgendes sollte das Tage auf Deutsch umstellen.
setlocale(LC_TIME, "de_DE", "german");
Danke für die Rückmeldung. Hab das mal eingefügt, aber dann ging nichts mehr. Mir ist nicht klar an welcher stelle ich das im Script einsetzen muss damit es auf Deutsch erscheint. Kannst mich da nochmal unterstützen?
Am besten gleich in der zweiten Zeile nach //
Hier findest du die Referenz bei PHP.net: https://www.php.net/manual/de/function.setlocale.php