Tôi hiện đang sử dụng Magpie RSS nhưng đôi khi nó bị đổ khi nguồn cấp dữ liệu RSS hoặc Atom không được hình thành tốt. Có bất kỳ tùy chọn nào khác để phân tích nguồn cấp dữ liệu RSS và Atom bằng PHP không?
Tôi hiện đang sử dụng Magpie RSS nhưng đôi khi nó bị đổ khi nguồn cấp dữ liệu RSS hoặc Atom không được hình thành tốt. Có bất kỳ tùy chọn nào khác để phân tích nguồn cấp dữ liệu RSS và Atom bằng PHP không?
Câu trả lời:
Các tùy chọn khác của bạn bao gồm:
Tôi đã luôn sử dụng các hàm SimpleXML được tích hợp sẵn trong PHP để phân tích các tài liệu XML. Đây là một trong số ít các trình phân tích cú pháp chung có cấu trúc trực quan, giúp dễ dàng xây dựng một lớp có ý nghĩa cho một cái gì đó cụ thể như nguồn cấp dữ liệu RSS. Ngoài ra, nó sẽ phát hiện các cảnh báo và lỗi XML và khi tìm thấy bất kỳ thứ gì bạn có thể chỉ cần chạy nguồn thông qua một cái gì đó như HTML Tidy (như ceejayoz đã đề cập) để dọn sạch và thử lại.
Hãy xem xét lớp đơn giản, rất đơn giản này bằng cách sử dụng 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;
thành $feed_uri = $file_or_url;
... khác, cảm ơn bạn vì mã này! Nó hoạt động rất tốt!
eregi_replace
bây giờ không được chấp nhận và đã được thay thế bằng preg_replace
cũng như eregi
với preg_match
. Tài liệu có thể được tìm thấy ở đây và ở đây tương ứng.
Với 4 dòng, tôi nhập rss vào một mảng.
$feed = implode(file('http://yourdomains.com/feed.rss'));
$xml = simplexml_load_string($feed);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
Đối với một giải pháp phức tạp hơn
$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');
có thể ít chuyên sâu hơn tệp + implode
Tôi muốn giới thiệu kịch bản đơn giản để phân tích 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++;
}
Nếu nguồn cấp dữ liệu không phải là XML được định dạng tốt, bạn phải từ chối nó, không có ngoại lệ. Bạn có quyền gọi người tạo thức ăn là bozo .
Nếu không, bạn sẽ mở đường để làm rối tung HTML.
Tôi sử dụng SimplePie để phân tích nguồn cấp dữ liệu Google Reader và nó hoạt động khá tốt và có một bộ tính năng hợp lý.
Tất nhiên, tôi đã không thử nghiệm nó với các nguồn cấp RSS / Atom không được định dạng tốt vì vậy tôi không biết nó đối phó với những nguồn đó như thế nào, tôi cho rằng Google tuân thủ khá chuẩn! :)
Trình đọc RSS PHP - http://www.scriptol.com/rss/rss-reader.php - là một trình phân tích cú pháp hoàn chỉnh nhưng đơn giản được sử dụng bởi hàng ngàn người dùng ...
Một trình phân tích cú pháp miễn phí tuyệt vời khác - http://bncscripts.com/free-php-rss-parser/ Nó rất nhẹ (chỉ 3kb) và dễ sử dụng!