質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • PHP

    21363questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    7678questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

[wordpress] feed.phpを使用しブログのrss,新着情報を表示しているが画像が取得できない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,387

yoso

score 17

こちらを参考にしrss情報を表示させています

http://kana-lier.com/web/php_rssfeed/

画像、日付、タイトル、本文(120文字)を表示させたいとおもっいますが「画像」を取得できません。

Feed.php

/**
 * RSS for PHP - small and easy-to-use library for consuming an RSS Feed
 *
 * @copyright  Copyright (c) 2008 David Grudl
 * @license    New BSD License
 * @version    1.2
 */
class Feed
{
    /** @var int */
    public static $cacheExpire = '1 day';

    /** @var string */
    public static $cacheDir;

    /** @var SimpleXMLElement */
    protected $xml;


    /**
     * Loads RSS or Atom feed.
     * @param  string
     * @param  string
     * @param  string
     * @return Feed
     * @throws FeedException
     */
    public static function load($url, $user = NULL, $pass = NULL)
    {
        $xml = self::loadXml($url, $user, $pass);
        if ($xml->channel) {
            return self::fromRss($xml);
        } else {
            return self::fromAtom($xml);
        }
    }


    /**
     * Loads RSS feed.
     * @param  string  RSS feed URL
     * @param  string  optional user name
     * @param  string  optional password
     * @return Feed
     * @throws FeedException
     */
    public static function loadRss($url, $user = NULL, $pass = NULL)
    {
        return self::fromRss(self::loadXml($url, $user, $pass));
    }


    /**
     * Loads Atom feed.
     * @param  string  Atom feed URL
     * @param  string  optional user name
     * @param  string  optional password
     * @return Feed
     * @throws FeedException
     */
    public static function loadAtom($url, $user = NULL, $pass = NULL)
    {
        return self::fromAtom(self::loadXml($url, $user, $pass));
    }


    private static function fromRss(SimpleXMLElement $xml)
    {
        if (!$xml->channel) {
            throw new FeedException('Invalid feed.');
        }

        self::adjustNamespaces($xml);

        foreach ($xml->channel->item as $item) {
            // converts namespaces to dotted tags
            self::adjustNamespaces($item);

            // generate 'timestamp' tag
            if (isset($item->{'dc:date'})) {
                $item->timestamp = strtotime($item->{'dc:date'});
            } elseif (isset($item->pubDate)) {
                $item->timestamp = strtotime($item->pubDate);
            }
        }
        $feed = new self;
        $feed->xml = $xml->channel;
        return $feed;
    }


    private static function fromAtom(SimpleXMLElement $xml)
    {
        if (!in_array('http://www.w3.org/2005/Atom', $xml->getDocNamespaces(), TRUE)
            && !in_array('http://purl.org/atom/ns#', $xml->getDocNamespaces(), TRUE)
        ) {
            throw new FeedException('Invalid feed.');
        }

        // generate 'timestamp' tag
        foreach ($xml->entry as $entry) {
            $entry->timestamp = strtotime($entry->updated);
        }
        $feed = new self;
        $feed->xml = $xml;
        return $feed;
    }


    /**
     * Returns property value. Do not call directly.
     * @param  string  tag name
     * @return SimpleXMLElement
     */
    public function __get($name)
    {
        return $this->xml->{$name};
    }


    /**
     * Sets value of a property. Do not call directly.
     * @param  string  property name
     * @param  mixed   property value
     * @return void
     */
    public function __set($name, $value)
    {
        throw new Exception("Cannot assign to a read-only property '$name'.");
    }


    /**
     * Converts a SimpleXMLElement into an array.
     * @param  SimpleXMLElement
     * @return array
     */
    public function toArray(SimpleXMLElement $xml = NULL)
    {
        if ($xml === NULL) {
            $xml = $this->xml;
        }

        if (!$xml->children()) {
            return (string) $xml;
        }

        $arr = array();
        foreach ($xml->children() as $tag => $child) {
            if (count($xml->$tag) === 1) {
                $arr[$tag] = $this->toArray($child);
            } else {
                $arr[$tag][] = $this->toArray($child);
            }
        }

        return $arr;
    }


    /**
     * Load XML from cache or HTTP.
     * @param  string
     * @param  string
     * @param  string
     * @return SimpleXMLElement
     * @throws FeedException
     */
    private static function loadXml($url, $user, $pass)
    {
        $e = self::$cacheExpire;
        $cacheFile = self::$cacheDir . '/feed.' . md5(serialize(func_get_args())) . '.xml';

        if (self::$cacheDir
            && (time() - @filemtime($cacheFile) <= (is_string($e) ? strtotime($e) - time() : $e))
            && $data = @file_get_contents($cacheFile)
        ) {
            // ok
        } elseif ($data = trim(self::httpRequest($url, $user, $pass))) {
            if (self::$cacheDir) {
                file_put_contents($cacheFile, $data);
            }
        } elseif (self::$cacheDir && $data = @file_get_contents($cacheFile)) {
            // ok
        } else {
            throw new FeedException('Cannot load feed.');
        }

        return new SimpleXMLElement($data, LIBXML_NOWARNING | LIBXML_NOERROR);
    }


    /**
     * Process HTTP request.
     * @param  string
     * @param  string
     * @param  string
     * @return string|FALSE
     * @throws FeedException
     */
    private static function httpRequest($url, $user, $pass)
    {
        if (extension_loaded('curl')) {
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            if ($user !== NULL || $pass !== NULL) {
                curl_setopt($curl, CURLOPT_USERPWD, "$user:$pass");
            }
            curl_setopt($curl, CURLOPT_HEADER, FALSE);
            curl_setopt($curl, CURLOPT_TIMEOUT, 20);
            curl_setopt($curl, CURLOPT_ENCODING , '');
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // no echo, just return result
            if (!ini_get('open_basedir')) {
                curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // sometime is useful :)
            }
            $result = curl_exec($curl);
            return curl_errno($curl) === 0 && curl_getinfo($curl, CURLINFO_HTTP_CODE) === 200
                ? $result
                : FALSE;

        } elseif ($user === NULL && $pass === NULL) {
            return file_get_contents($url);

        } else {
            throw new FeedException('PHP extension CURL is not loaded.');
        }
    }


    /**
     * Generates better accessible namespaced tags.
     * @param  SimpleXMLElement
     * @return void
     */
    private static function adjustNamespaces($el)
    {
        foreach ($el->getNamespaces(TRUE) as $prefix => $ns) {
            $children = $el->children($ns);
            foreach ($children as $tag => $content) {
                $el->{$prefix . ':' . $tag} = $content;
            }
        }
    }

}



/**
 * An exception generated by Feed.
 */
class FeedException extends Exception
{
}

表示させたい位置に

require_once "/Feed.php" ; //rss-phpライブラリを読み込みます
$feed = new Feed ;
$url = "#/feed/"; //RSSのURLを入力する
$rss = $feed->loadRss( $url ) ;
$num = 4;//表示させたい件数
$i=0;
$desW = 120;//詳細の文字数を制限します。制限しないときは0にします。
if ( $desW != 0){
    $desW = ($desW*2)+2;
}
foreach( $rss->item as $item )
{
    if($i>=$num){
    }
    else{
        $title = $item->title ;    // タイトル
        $link = $item->link ; // リンク
        $timestamp = strtotime( $item->pubDate ) ; // 更新日時
        $description = $item->description ; // 詳細
        $description = str_replace("▼続きを読む","",$description);
        //↑ 続きを読むなど、決まった文章が詳細にはいっている場合に、それを除外する
        $description = strip_tags($description);
        if ( $desW != 0){
            $description = mb_strimwidth($description, 0, $desW, "…",'utf-8');
        }
        $thumbnail = trim($now_url,"/") . "noimage.jpg";//画像がない場合の指定
        if( preg_match_all('/<img([\s\S]+?)>/is', $item->description, $matches) ){
            foreach( $matches[0] as $img ){
                if ($img === reset($matches[0])) {//最初の画像にマッチしたもの
                    if( preg_match('/src=[\'"](.+?(jpe?g|png))[\'"]/', $img, $m) ){

                        $thumbnail = $m[1];
                    }
                }
            }
        }

        ?>

<img src="<?php print $thumbnail; ?>" alt="<?php print $item->title; ?>" width="300">
<p class="date"><?php echo date( "M d Y", $timestamp); ?></p>
        <h3><a href="<?php echo $link; ?>" target="_blank"><?php echo $title; ?></a></h3>
        <p class="text"><?php echo $description; ?><a href="' + entry.link + '">more</a></p>



    <?php
        $i++;
    }
}
?>

画像表示に関わる
if( preg_match('/src=[\'"](.+?(jpe?g|png))[\'"]/', $img, $m) ){
がおかしいのだと思うのですが、どこがどう違うのかが分かりません。

単純なことかもしれないのですが、調べても分からずまたコチラにご質問しました。
よろしくお願いいたします。

*追記

kei344さんいつもありがとうございます。
初心者過ぎて申し訳ないのですが
$item->description に画像が含まれているか
おかしいと思われている箇所の変数の値などを出力
がそもそも分かりません。

RSSのurlは
http://www.happymillion.jp/?feed=rss2
を入力しています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kei344

    2017/01/13 22:46

    $item->description に画像が含まれているか、おかしいと思われている箇所の変数の値などを出力されてみてはいかがでしょう。また、どのRSSから値を取得しているかを明確にしたほうが解決しやすいと思います。

    キャンセル

回答 1

checkベストアンサー

0

require_once "Feed.php" ; //rss-phpライブラリを読み込みます
$feed = new Feed ;
$url = "http://www.happymillion.jp/?feed=rss2"; //RSSのURLを入力する
$rss = $feed->loadRss( $url ) ;
$num = 4;//表示させたい件数
$i=0;
$desW = 120;//詳細の文字数を制限します。制限しないときは0にします。
if ( $desW != 0){
    $desW = ($desW*2)+2;
}
foreach( $rss->item as $item )
{
    if($i>=$num){
    }
    else{
        $title = $item->title ;    // タイトル
        $link = $item->link ; // リンク
        $timestamp = strtotime( $item->pubDate ) ; // 更新日時
        //                        ↓ WordPressのRSS2.0には description に本文は入っていないので。
        $description = $item->{"content:encoded"} ; // 詳細
        $thumbnail = trim($now_url,"/") . "noimage.jpg";//画像がない場合の指定
        if( preg_match_all('/<img([\s\S]+?)>/is', $description, $matches) ){
            foreach( $matches[0] as $img ){
                if ($img === reset($matches[0])) {//最初の画像にマッチしたもの
                    if( preg_match('/src=[\'"](.+?(jpe?g|png))[\'"]/', $img, $m) ){

                        $thumbnail = $m[1];
                    }
                }
            }
        }
        $description = str_replace("▼続きを読む","",$description);
        //↑ 続きを読むなど、決まった文章が詳細にはいっている場合に、それを除外する
        $description = strip_tags($description);
        if ( $desW != 0){
            $description = mb_strimwidth($description, 0, $desW, "…",'utf-8');
        }

        ?>

<img src="<?php print $thumbnail; ?>" alt="<?php print $item->title; ?>" width="300">
<p class="date"><?php echo date( "M d Y", $timestamp); ?></p>
        <h3><a href="<?php echo $link; ?>" target="_blank"><?php echo $title; ?></a></h3>
        <p class="text"><?php echo $description; ?><a href="' + entry.link + '">more</a></p>



    <?php
        $i++;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/14 17:40

    ありがとうございます。
    全く検討以外のところで情報を探していました。

    {"content:encoded"}までは先ほどたどり着いたのですが
    http://blog.showzine.co/entry/magpie-rss-wordpress
    結局どうすればよいか分からず困っていました。

    ありがとうございます!!

    キャンセル

同じタグがついた質問を見る

  • PHP

    21363questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    7678questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。