Cara terbaik untuk mengurai RSS / Atom feed dengan PHP [closed]
135
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?
Ada satu masalah dengan permintaan ini, sebagian besar pembaca Feed menggunakan pembaca XML inti php dan jika XML tidak Berformat Baik seperti yang dipersyaratkan oleh standar XML, itu akan gagal, Anda dapat melihat yang tidak menggunakan pembaca XML dan menggunakan Pembaca Teks bagaimanapun beban di server akan meningkat secara dramatis. Saya tahu ini terjawab. Saya hanya membuat orang sadar akan kekurangan menggunakan pembaca umpan XML
Barkermn01
1
Jangan pernah mencoba mengurai XML yang tidak valid. Salahkan sumbernya.
Saya tidak suka "jawaban" seperti itu, memberi link tanpa komentar. Sepertinya Anda mencarinya di Google dan menautkan ke beberapa hasil teratas. Terutama karena penanya memiliki pengalaman RSS dan membutuhkan parser yang lebih baik .
dualitas_
3
Jika seseorang membutuhkan sedikit saran, RSS Terakhir adalah yang termudah di antara tiga yang tercantum di atas. Hanya 1 file yang "membutuhkan", dan dapat mengambil RSS dalam 5 baris, dengan output array yang layak.
Saya telah menggunakan dua di antaranya dan LastRss tampaknya tidak cukup baik untuk menyediakan pembantu yang berfungsi penuh dan SimplePie agak terlalu rumit. Saya ingin mencoba beberapa yang lain tetapi komentar ke libs itu lebih baik untuk dipahami orang, bukan hanya tautan.
noob
171
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:
classBlogPost{
var $date;
var $ts;
var $link;
var $title;
var $text;
}
classBlogFeed{
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;
}
}
privatefunctionresolveFile($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;
}
privatefunctionsummarizeText($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;
}
}
Ya, saya punya satu, tetapi dimakan oleh pemformat kode SO karena tidak ada baris kosong di atasnya. Pada catatan terkait, Anda tidak memulai kalimat Anda dengan huruf kapital. ;)
Brian Cline
4
Harap ubah $feed_uri = $feed_or_url;ke $feed_uri = $file_or_url;... selain itu, terima kasih atas kode ini! Ini bekerja dengan baik!
Tim
5
Perhatikan bahwa meskipun solusi ini bagus, itu hanya akan mengurai RSS feed dalam bentuknya saat ini. Umpan atom tidak akan diurai karena skema yang berbeda.
András Szepesházi
9
Perhatikan bahwa eregi_replacesekarang tidak digunakan lagi dan telah diganti dengan preg_replaceserta eregidengan preg_match. Dokumentasi masing-masing dapat ditemukan di sini dan di sini .
dapatkah kamu memberi saya rss feed yang kamu gunakan?
PJunior
2
Jika Anda bertanya-tanya. Sepertinya dia menggunakan umpan tumblr rss. Anytumblrsite.com/rss akan memberi Anda hasil yang sama.
andrewk
3
Menggunakan 4 baris, melakukan pekerjaan dengan baik :) tetapi kemudian saya menulis ulang baris pertama: $feed = file_get_contents('http://yourdomains.com/feed.rss');mungkin kurang intensif daripada file + implode
+1, Anda tidak boleh mencoba mengatasi XML apa pun yang bentuknya tidak baik. Kami punya pengalaman buruk dengan mereka, percayalah, itu sangat menyakitkan :(
Helen Neely
35
Namun, programmer tidak boleh memilih mitra bisnis dan harus mengurai apa yang diberikan kepada mereka.
Edmond Meinfelder
2
Bagaimana jika Anda membuat pembaca RSS / Atom feed universal? Jika ada file xml dengan format yang salah dapat "mengacaukan" HTML Anda, siapakah Bozo? ;) Bersikaplah liberal dalam apa yang Anda terima.
yPhil
6
Pustaka HTML Tidy dapat memperbaiki beberapa file XML yang rusak. Menjalankan feed Anda melalui itu sebelum meneruskannya ke parser dapat membantu.
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! :)
Jawaban:
Pilihan Anda yang lain termasuk:
sumber
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; } }
sumber
$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 denganpreg_replace
sertaeregi
denganpreg_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);
sumber
$feed = file_get_contents('http://yourdomains.com/feed.rss');
mungkin kurang intensif daripada file + implodeSaya 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++; }
sumber
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.
sumber
Pustaka HTML Tidy dapat memperbaiki beberapa file XML yang rusak. Menjalankan feed Anda melalui itu sebelum meneruskannya ke parser dapat membantu.
sumber
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! :)
sumber
Secara pribadi saya menggunakan BNC Advanced Feed Parser- saya menyukai sistem templatnya yang sangat mudah digunakan
sumber
Pembaca RSS PHP - http://www.scriptol.com/rss/rss-reader.php - adalah parser lengkap namun sederhana yang digunakan oleh ribuan pengguna ...
sumber
Pengurai gratis hebat lainnya - http://bncscripts.com/free-php-rss-parser/ Sangat ringan (hanya 3kb) dan mudah digunakan!
sumber