Şu anda Magpie RSS kullanıyorum, ancak RSS veya Atom beslemesi iyi biçimlendirilmediğinde bazen düşer. RSS ve Atom yayınlarını PHP ile ayrıştırmak için başka seçenekler var mı?
Şu anda Magpie RSS kullanıyorum, ancak RSS veya Atom beslemesi iyi biçimlendirilmediğinde bazen düşer. RSS ve Atom yayınlarını PHP ile ayrıştırmak için başka seçenekler var mı?
Yanıtlar:
Diğer seçenekleriniz şunları içerir:
Ben her zaman XML belgelerini ayrıştırmak için PHP yerleşik SimpleXML fonksiyonları kullandım . Bu, sezgisel bir yapıya sahip birkaç jenerik ayrıştırıcıdan biridir, bu da RSS beslemesi gibi belirli bir şey için anlamlı bir sınıf oluşturmayı son derece kolaylaştırır. Ayrıca, XML uyarılarını ve hatalarını algılar ve herhangi bir bulduktan sonra kaynağı temizlemek ve tekrar denemek için HTML Tidy (ceejayoz'un belirttiği gibi) gibi bir şeyle çalıştırabilirsiniz.
SimpleXML kullanarak bu çok kaba ve basit sınıfı düşünün:
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;
için $feed_uri = $file_or_url;
bundan daha başka ... bu kod için teşekkür ederim! Harika çalışıyor!
eregi_replace
artık desteklenmiyor, ile değiştirilmiştir preg_replace
yanı sıra eregi
ile preg_match
. Dokümanları sırasıyla burada ve burada bulabilirsiniz .
4 satır ile bir diziye bir rss almak.
$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Daha karmaşık bir çözüm için
$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');
dosya + implode daha az yoğun olabilir
RSS ayrıştırmak için basit komut dosyası tanıtmak istiyorum:
$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++;
}
Feed iyi biçimlendirilmiş XML değilse, bunu reddetmeniz gerekir, istisna yok. Feed yaratıcısına bozo deme hakkına sahipsiniz .
Aksi takdirde, HTML'nin karıştığı karışıklığı kaldırırsınız.
Kullandığım SimplePieBir Google Reader özet akışını ayrıştırmak ve oldukça iyi çalışıyor ve iyi bir özellik kümesi var.
Tabii ki, iyi biçimlendirilmemiş RSS / Atom yayınları ile test etmedim, bu yüzden bunlarla nasıl başa çıkacağını bilmiyorum, Google'ın oldukça standartlara uygun olduğunu varsayıyorum! :)
PHP RSS okuyucu - http://www.scriptol.com/rss/rss-reader.php - binlerce kullanıcı tarafından kullanılan eksiksiz ama basit bir ayrıştırıcı ...
Başka bir harika ücretsiz ayrıştırıcı - http://bncscripts.com/free-php-rss-parser/ Çok hafif (sadece 3kb) ve kullanımı basit!