J'utilise actuellement Magpie RSS mais cela tombe parfois lorsque le flux RSS ou Atom n'est pas bien formé. Existe-t-il d'autres options pour analyser les flux RSS et Atom avec PHP?
J'utilise actuellement Magpie RSS mais cela tombe parfois lorsque le flux RSS ou Atom n'est pas bien formé. Existe-t-il d'autres options pour analyser les flux RSS et Atom avec PHP?
Réponses:
Vos autres options incluent:
J'ai toujours utilisé les fonctions SimpleXML intégrées à PHP pour analyser les documents XML. C'est l'un des rares analyseurs génériques à avoir une structure intuitive, ce qui rend extrêmement facile la création d'une classe significative pour quelque chose de spécifique comme un flux RSS. De plus, il détectera les avertissements et les erreurs XML, et après en trouver, vous pourrez simplement exécuter la source via quelque chose comme HTML Tidy (comme ceejayoz l'a mentionné) pour le nettoyer et le réessayer.
Considérez cette classe très grossière et simple utilisant 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;
pour $feed_uri = $file_or_url;
... autre que cela, merci pour ce code! Cela fonctionne très bien!
eregi_replace
est désormais obsolète et a été remplacé par preg_replace
ainsi que eregi
par preg_match
. Des documentations peuvent être trouvées ici et ici respectivement.
Avec 4 lignes, j'importe un rss dans un tableau.
$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Pour une solution plus complexe
$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');
peut-être moins intensive que file + imploser
Je voudrais introduire un script simple pour analyser RSS:
$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++;
}
Si le flux n'est pas un XML bien formé, vous êtes censé le rejeter, sans exception. Vous avez le droit d'appeler le créateur de flux un bozo .
Sinon, vous préparez le terrain pour gâcher ce HTML.
J'utilise SimplePie pour analyser un flux Google Reader et cela fonctionne plutôt bien et dispose d'un ensemble de fonctionnalités décent.
Bien sûr, je ne l'ai pas testé avec des flux RSS / Atom non bien formés, donc je ne sais pas comment il y fait face, je suppose que Google est assez conforme aux normes! :)
Le lecteur PHP RSS - http://www.scriptol.com/rss/rss-reader.php - est un analyseur complet mais simple utilisé par des milliers d'utilisateurs ...
Un autre excellent analyseur gratuit - http://bncscripts.com/free-php-rss-parser/ Il est très léger (seulement 3 Ko) et simple à utiliser!