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'];
}

Tobi

Hallo, mein Name ist Tobias und ich habe diesen Blog im April 2009 ins Leben gerufen. Seitdem blogge ich hier über Software, Internet, Windows und andere Themen, die mich interessieren. SSDblog ist mein zweiter Blog, indem es rund um das Thema SSDs geht. Ich würde mich freuen, wenn ihr meinen Feed abonniert oder mir auf Twitter und Facebook folgt.

27 Antworten

  1. Sylar sagt:

    Probleme mit dem Zeichensatz, oder was soll bitte “-&gt” “=&gt” im Code bedeuten?

    Gruß Sylar

  2. Sylar sagt:

    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.

    • Tobi sagt:

      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]

  3. Sylar sagt:

    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

    • Tobi sagt:

      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]

  4. Sylar sagt:

    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

    • Tobi sagt:

      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!

  5. Thomas sagt:

    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 :)

    • Tobi sagt:

      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!

  6. Paul Hamann sagt:

    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!

  7. Anke sagt:

    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

  8. Dominic sagt:

    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

  9. Dominic sagt:

    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’]

    • Tobi sagt:

      Bilder werden meist als HTML-Code im Content-Item ausgegeben. Du musst dein Array also um folgenden Eintrag erweitern:

       'content' => (string) $item->content,

      Darin musst du das Bild dann wohl manuell herausfiltern.

  10. Steffi sagt:

    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? :)

  11. Raimund sagt:

    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

  12. Dennis sagt:

    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

    • Tobi sagt:

      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!

  13. Dennis sagt:

    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? 🙏

    • Tobi sagt:

      Dann musst du wohl deine PHP-Kenntnisse aufbessern ;-)
      Ganz quick’n dirty ohne Gewähr:
      Im Array die Zeile ‘date” mit folgender austauschen:

      'date'         => strtotime((string) $item->pubDate)

      Und unten folgendes:

      
      $now = time() - (6 * 60 * 60);
      
      foreach ($out as $value) {
      	
      	if($value['date'] > $now ) {
          		echo $value['title'].$value['description'].$value['link'];
      	}
      }
  14. Michi sagt:

    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

  15. Tobi sagt:

    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?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert