Zend_Feed ライブラリで 1 レベル以上の深さのアイテムを追跡する正しい方法は何ですか?
コードの最後から 2 行目はどのように読むべきですか?
require_once 'Zend/Feed/Rss.php';
$url = 'http://leo.am/podcasts/twit';
$c = new Zend_Feed_Rss($url);
$iu = $c->image()->url();
echo $iu;
Zend_Feed ライブラリで 1 レベル以上の深さのアイテムを追跡する正しい方法は何ですか?
コードの最後から 2 行目はどのように読むべきですか?
require_once 'Zend/Feed/Rss.php';
$url = 'http://leo.am/podcasts/twit';
$c = new Zend_Feed_Rss($url);
$iu = $c->image()->url();
echo $iu;
これはかなり面白かったです!
RSS フィードには 2 つのタグがimage
あります。
<image>
<url>http://leoville.tv/podcasts/coverart/twit144audio.jpg</url>
<!-- ... more stuff ... -->
</image>
<!-- ... more stuff ... -->
<itunes:image href="http://leoville.tv/podcasts/coverart/twit600audio.jpg"/>
最初のimage
ものはデフォルトの名前空間にあり、子ノードがあります。これはおそらくあなたが望むものです。2 番目は明らかに iTunes 固有であるため、itunes
名前空間にあり、url はhref
属性にあります。
問題は$c->image
、配列内の両方の要素を返すことです。それがバグなのか、意図したとおりに機能するのかはわかりません。
したがって、すべての要素をループして、iTunes からのものか、RSS からのものかを確認する必要があります。このコードは、定義されている限り、配列内の itunes と rss 画像の URL の両方を返します。何も見つからない場合、配列は空です:
require_once 'Zend/Feed/Rss.php';
// iTunes Namespace URI
define('RSS_NS_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd');
function getImageFromElement(Zend_Feed_Element $elem) {
$result = array();
$elemDOM = $elem->getDOM();
if(RSS_NS_ITUNES == $elemDOM->namespaceURI) {
$result["itunes"] = $elemDOM->getAttribute('href');
} else if("" == $elemDOM->namespaceURI) {
$url = $elem->url();
if($url)
$result["rss"] = $url;
}
return $result;
}
function getFeedImages(Zend_Feed_Rss $feed) {
$imgContent = $feed->image;
$result = array();
if(is_array($imgContent)) {
// Multiple elements returned
// check every element for valid URLs
foreach($imgContent as $i) {
$result = array_merge($result,
getImageFromElement($i));
}
} else if($imgContent instanceof Zend_Feed_Element) {
// Check the one element we've got
$result = getImageFromElement($imgContent);
}
return $result;
}
// usage:
$url = 'http://leo.am/podcasts/twit';
$c = new Zend_Feed_Rss($url);
$imageUrls = getFeedImages($c);
var_dump($imageUrls);
出力は次のようになります。
array(2) {
["rss"]=>
string(53) "http://leoville.tv/podcasts/coverart/twit144audio.jpg"
["itunes"]=>
string(53) "http://leoville.tv/podcasts/coverart/twit600audio.jpg"
}
編集:iTunesのURLを気にしない場合は、簡潔な代替手段があります:
$url = 'http://leo.am/podcasts/twit';
$c = new Zend_Feed_Rss($url);
$imgNoNs=":image";
echo $c->$imgNoNs->url();
出力:
http://leoville.tv/podcasts/coverart/twit144audio.jpg
私はこのようにします:
$feed = Zend_Feed::import('http://www.sports.ru/rss/all_news.xml');
$data = array();
foreach ($feed as $entry)
{
$data[] = array(
'title' => $entry->title(),
'description' => $entry->description(),
'image' => $entry->enclosure->getDom()->getAttribute('url'),
);
}