Saat ini saya menggunakan Magpie RSS tetapi terkadang gagal saat RSS atau umpan Atom tidak dibentuk dengan baik. Apakah ada opsi lain untuk mengurai RSS dan Atom feed dengan PHP?
Saat ini saya menggunakan Magpie RSS tetapi terkadang gagal saat RSS atau umpan Atom tidak dibentuk dengan baik. Apakah ada opsi lain untuk mengurai RSS dan Atom feed dengan PHP?
Jawaban:
Pilihan Anda yang lain termasuk:
Saya selalu menggunakan fungsi SimpleXML bawaan PHP untuk mengurai dokumen XML. Ini adalah salah satu dari sedikit parser generik di luar sana yang memiliki struktur intuitif, yang membuatnya sangat mudah untuk membangun kelas yang bermakna untuk sesuatu yang spesifik seperti umpan RSS. Selain itu, ini akan mendeteksi peringatan dan kesalahan XML, dan setelah menemukannya, Anda dapat menjalankan sumber melalui sesuatu seperti HTML Tidy (seperti yang disebutkan ceejayoz) untuk membersihkannya dan mencobanya lagi.
Pertimbangkan kelas yang sangat kasar dan sederhana ini menggunakan 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;
ke $feed_uri = $file_or_url;
... selain itu, terima kasih atas kode ini! Ini bekerja dengan baik!
eregi_replace
sekarang tidak digunakan lagi dan telah diganti dengan preg_replace
serta eregi
dengan preg_match
. Dokumentasi masing-masing dapat ditemukan di sini dan di sini .
Dengan 4 baris, saya mengimpor rss ke array.
$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Untuk solusi yang lebih kompleks
$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');
mungkin kurang intensif daripada file + implode
Saya ingin memperkenalkan skrip sederhana untuk mengurai 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++;
}
Jika feed bukan XML dengan format yang baik, Anda seharusnya menolaknya, tanpa pengecualian. Anda berhak menyebut pembuat feed sebagai bozo .
Jika tidak, Anda sedang membuka jalan untuk mengacaukan HTML itu.
Saya menggunakan SimplePie untuk mengurai umpan Pustaka Google dan berfungsi dengan baik serta memiliki serangkaian fitur yang layak.
Tentu saja, saya belum mengujinya dengan umpan RSS / Atom yang tidak berformat baik jadi saya tidak tahu bagaimana cara mengatasinya, saya berasumsi bahwa Google cukup memenuhi standar! :)
Pembaca RSS PHP - http://www.scriptol.com/rss/rss-reader.php - adalah parser lengkap namun sederhana yang digunakan oleh ribuan pengguna ...
Pengurai gratis hebat lainnya - http://bncscripts.com/free-php-rss-parser/ Sangat ringan (hanya 3kb) dan mudah digunakan!