Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Artfiles.de
Bietet Serviceorientierte...
https://www.Artfiles.de
Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains...
https://www.Hosterplus.de
 
 
 

RSS-Feed mit PHP einlesen und anzeigen

Sie befinden sich: Home > Php Tutorial > RSS-Feed mit PHP einlesen...

RSS-Feed mit PHP einlesen und anzeigen


Eintrag am:  27.10.2010
Hits / Besucher:  18091
Sprache:  Deutsch
Kategorie:  Fortgeschrittene...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

Viele Webseiten bieten ihre Inhalte als RSS-Feed an. Das ist ein standardisiertes XML-Format, über das Schlagzeilen, Beschreibungen und Links zu neuen Beiträgen bereitgestellt werden. Mit PHP lassen sich solche Feeds einlesen und auf der eigenen Seite darstellen. So können zum Beispiel aktuelle News, Blogbeiträge oder Podcast-Episoden automatisch angezeigt werden, ohne den Inhalt manuell zu pflegen.

Aufbau eines RSS-Feeds

Ein RSS-Feed ist eine XML-Datei mit einer festen Struktur. Jeder Eintrag steckt in einem <item>-Element innerhalb von <channel>. Die wichtigsten Felder pro Eintrag sind <title>, <link> und <description>.

<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0">
<channel>
<title>Beispiel-Blog</title>
<link>https://example.com</link>
<description>Neueste Beiträge</description>
<item>
<title>Erster Beitrag</title>
<link>https://example.com/beitrag-1</link>
<description>Kurzbeschreibung...</description>
<pubDate>Mon, 24 Feb 2025 10:00:00 +0100</pubDate>
</item>
</channel>
</rss>

PHP bringt mit der SimpleXML-Erweiterung alles mit, was zum Parsen solcher Feeds nötig ist.

Feed einlesen mit simplexml_load_file()

Die Funktion simplexml_load_file() lädt eine XML-Datei und gibt ein Objekt zurück, über das sich alle Elemente bequem ansprechen lassen. Die einzelnen Feed-Einträge stecken in $xml->channel->item.

<?php

$feedUrl = 'https://www.php.net/releases/feed.php';

$xml = simplexml_load_file($feedUrl);

if ($xml === false) {
echo 'Feed konnte nicht geladen werden.';
} else {
foreach ($xml->channel->item as $item) {
echo htmlspecialchars((string) $item->title);
echo "<br>\n";
}
}
?>

Wichtig ist der Cast auf (string). SimpleXML gibt standardmäßig Objekte zurück, keine reinen Strings. Ohne den Cast können Vergleiche oder Funktionen wie htmlspecialchars() unerwartete Ergebnisse liefern.

Feed-Einträge als HTML ausgeben

In der Praxis sollen die Feed-Einträge als klickbare Links mit Beschreibung dargestellt werden. Das folgende Beispiel erzeugt eine Übersichtsliste mit Titel, Link und Datum.

<?php

$feedUrl = 'https://www.php.net/releases/feed.php';
$maxItems = 10;

$xml = simplexml_load_file(
$feedUrl,
'SimpleXMLElement',
LIBXML_NOCDATA
);

if ($xml === false) {
echo '<p>Der Feed ist momentan nicht erreichbar.</p>';
} else {
echo '<ul>';
$count = 0;

foreach ($xml->channel->item as $item) {
if ($count >= $maxItems) {
break;
}

$title = htmlspecialchars(
(string) $item->title
);
$link = htmlspecialchars(
(string) $item->link
);
$desc = htmlspecialchars(
(string) $item->description
);

echo "<li>";
echo "<a href=\"" . $link
. "\" target=\"_blank\"
rel=\"noopener\">";
echo $title . "</a>";

if ($desc !== '') {
echo "<br><small>"
. $desc . "</small>";
}
echo "</li>\n";

$count++;
}

echo '</ul>';
}
?>

Das Flag LIBXML_NOCDATA sorgt dafür, dass CDATA-Abschnitte im Feed als normaler Text behandelt werden. Manche Feeds verpacken Titel oder Beschreibung in CDATA, was ohne dieses Flag zu leeren Strings führen würde. Alle Ausgaben werden mit htmlspecialchars() behandelt, damit keine Sonderzeichen oder eingeschleuster HTML-Code die eigene Seite beschädigen.

Fehlerbehandlung und Timeouts

Wenn der externe Server nicht erreichbar ist, blockiert simplexml_load_file() den Seitenaufbau, bis PHP den Standard-Timeout erreicht. Das kann mehrere Sekunden dauern. Mit einem Stream-Context lässt sich ein eigener Timeout setzen.

<?php

$feedUrl = 'https://www.php.net/releases/feed.php';

$context = stream_context_create([
'http' => [
'timeout' => 5,
'user_agent' => 'PHP Feed Reader',
],
]);

/* Feed als String laden,
dann als XML parsen */
$xmlString = @file_get_contents(
$feedUrl,
false,
$context
);

if ($xmlString === false) {
echo 'Feed nicht erreichbar.';
} else {
$xml = simplexml_load_string(
$xmlString,
'SimpleXMLElement',
LIBXML_NOCDATA
);

if ($xml === false) {
echo 'Feed-XML ist fehlerhaft.';
} else {
foreach ($xml->channel->item as $item) {
echo htmlspecialchars(
(string) $item->title
) . "<br>\n";
}
}
}
?>

Der Umweg über file_get_contents() mit anschließendem simplexml_load_string() hat einen Vorteil: Der Timeout greift zuverlässig. Außerdem lassen sich über den Context weitere HTTP-Optionen setzen, etwa ein User-Agent oder Proxy-Einstellungen.

Zeichensatz-Probleme beheben

Die meisten modernen RSS-Feeds verwenden UTF-8. Wenn die eigene Seite ebenfalls UTF-8 nutzt, gibt es normalerweise keine Probleme. Schwierig wird es bei älteren Feeds, die mit ISO-8859-1 oder Windows-1252 kodiert sind. In solchen Fällen erscheinen Umlaute als kryptische Zeichen.

<?php

/* Zeichensatz eines Strings konvertieren */
$text = mb_convert_encoding(
$text,
'UTF-8', // Ziel-Encoding
'ISO-8859-1' // Quell-Encoding
);

/* Wenn das Quell-Encoding unbekannt ist,
kann mb_detect_encoding() helfen */
$encoding = mb_detect_encoding(
$text,
['UTF-8', 'ISO-8859-1', 'Windows-1252'],
true // strict mode
);

if ($encoding !== false && $encoding !== 'UTF-8') {
$text = mb_convert_encoding(
$text, 'UTF-8', $encoding
);
}
?>

Die Funktion mb_convert_encoding() ersetzt das ältere iconv() und ist seit PHP 8.0 in jeder Installation verfügbar. Der erste Parameter ist der zu konvertierende Text, der zweite das Ziel-Encoding und der dritte das aktuelle Encoding des Textes.

Feed-Ergebnisse zwischenspeichern

Einen externen Feed bei jedem Seitenaufruf neu zu laden ist langsam und belastet den Feed-Anbieter unnötig. Besser ist es, das Ergebnis für einige Minuten in einer lokalen Datei zu speichern.

<?php

$feedUrl = 'https://www.php.net/releases/feed.php';
$cacheFile = __DIR__ . '/cache/feed_php.html';
$cacheTime = 1800; // 30 Minuten

/* Prüfen ob Cache noch gültig ist */
if (file_exists($cacheFile)
&& filemtime($cacheFile) > time() - $cacheTime
) {
echo file_get_contents($cacheFile);
} else {
/* Feed frisch laden */
$context = stream_context_create([
'http' => ['timeout' => 5],
]);

$xmlString = @file_get_contents(
$feedUrl, false, $context
);

if ($xmlString === false) {
/* Alten Cache als Fallback nutzen */
if (file_exists($cacheFile)) {
echo file_get_contents($cacheFile);
} else {
echo '<p>Feed nicht verfügbar.</p>';
}
} else {
$xml = simplexml_load_string(
$xmlString, 'SimpleXMLElement',
LIBXML_NOCDATA
);

if ($xml === false) {
echo '<p>Feed fehlerhaft.</p>';
} else {
$html = '<ul>';
foreach ($xml->channel->item as $item) {
$title = htmlspecialchars(
(string) $item->title
);
$link = htmlspecialchars(
(string) $item->link
);
$html .= "<li><a href=\""
. $link . "\">"
. $title . "</a></li>\n";
}
$html .= '</ul>';

/* Cache speichern */
file_put_contents(
$cacheFile, $html, LOCK_EX
);
echo $html;
}
}
}
?>

Ein praktisches Detail in diesem Beispiel: Wenn der Feed nicht erreichbar ist, wird der alte Cache als Fallback angezeigt. So bleibt die Seite auch bei vorübergehenden Ausfällen des Feed-Anbieters funktionstfühig.

Atom-Feeds und andere Formate

Neben RSS 2.0 gibt es das Atom-Format. Atom-Feeds haben eine etwas andere Struktur. Die Einträge heißen <entry> statt <item>, und der Link steckt in einem Attribut statt im Element-Text.

<?php

$feedUrl = 'https://example.com/atom.xml';

$xml = simplexml_load_file($feedUrl);

if ($xml === false) {
echo 'Feed konnte nicht geladen werden.';
} else if (isset($xml->channel->item)) {
/* RSS 2.0 Format */
foreach ($xml->channel->item as $item) {
$title = (string) $item->title;
$link = (string) $item->link;
echo htmlspecialchars($title)
. "<br>\n";
}
} else if (isset($xml->entry)) {
/* Atom Format */
foreach ($xml->entry as $entry) {
$title = (string) $entry->title;
$link = '';

/* Link aus dem href-Attribut holen */
if (isset($entry->link['href'])) {
$link = (string)$entry->link['href'];
}

echo htmlspecialchars($title)
. "<br>\n";
}
}
?>

Wer regelmäßig verschiedene Feed-Formate verarbeiten muss, kann auch eine fertige Bibliothek wie simplepie/simplepie per Composer einbinden. SimplePie erkennt das Format automatisch und liefert eine einheitliche API für RSS, Atom und weitere Formate.

 

Tags:

 

Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.