Attualmente sto usando Magpie RSS ma a volte cade quando il feed RSS o Atom non è ben formato. Esistono altre opzioni per l'analisi dei feed RSS e Atom con PHP?
Attualmente sto usando Magpie RSS ma a volte cade quando il feed RSS o Atom non è ben formato. Esistono altre opzioni per l'analisi dei feed RSS e Atom con PHP?
Risposte:
Le altre tue opzioni includono:
Ho sempre usato le funzioni SimpleXML integrate in PHP per analizzare documenti XML. È uno dei pochi parser generici là fuori che ha una struttura intuitiva, il che rende estremamente facile costruire una classe significativa per qualcosa di specifico come un feed RSS. Inoltre, rileverà avvisi ed errori XML e, trovandone uno, potresti semplicemente eseguire il sorgente attraverso qualcosa come HTML Tidy (come ceejayoz citato) per ripulirlo e riprovare.
Considera questa classe molto approssimativa e semplice usando 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;
in $feed_uri = $file_or_url;
... a parte questo, grazie per questo codice! Funziona benissimo!
eregi_replace
ora è obsoleto ed è stato sostituito con preg_replace
e eregi
con preg_match
. La documentazione può essere trovata qui e qui rispettivamente.
Con 4 righe, importare un rss in un array.
$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Per una soluzione più complessa
$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');
potrebbe essere meno intensivo di file + implode
Vorrei introdurre un semplice script per analizzare 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++;
}
Se il feed non è un XML ben formato, dovresti rifiutarlo, senza eccezioni. Hai il diritto di chiamare il creatore di feed un bozo .
Altrimenti stai aprendo la strada al caos in cui è finito HTML.
Uso SimplePie per analizzare un feed di Google Reader e funziona abbastanza bene e ha un set di funzionalità decente.
Certo, non l'ho testato con feed RSS / Atom non ben formati, quindi non so come gestirli, suppongo che quelli di Google siano abbastanza conformi agli standard! :)
Il lettore RSS PHP - http://www.scriptol.com/rss/rss-reader.php - è un parser completo ma semplice utilizzato da migliaia di utenti ...
Un altro ottimo parser gratuito - http://bncscripts.com/free-php-rss-parser/ È molto leggero (solo 3kb) e semplice da usare!