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

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

ただいまの
回答率

88.93%

PHPでアメーバブログのRSSから画像を表示させたい

解決済

回答 1

投稿 編集

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

sazami

score 16

WordpressサイトにアメブロのRSSを使用し、新着のタイトル・日付・記事内容・最初の投稿写真を5件表示させたいと思い、PHPを作成しました。
記事内にある絵文字は除外し、投稿写真の最初の物を表示させます。

全て表示はされているのですが、写真が最初の物ではなく最後の物が表示されてしまいます。
調べてもどこに原因があるのかわからず、質問させていただきました。 
アドバイスいただけると大変助かります。よろしくお願い致します。

↓こちらのFeed.phpを設置
https://github.com/dg/rss-php

↓Wordpressのindex.phpに書いたphpコード

<?php 
require_once "Feed.php" ;
$feed = new Feed ;
$url = "RSSのURL入力";
$rss = $feed->loadRss( $url ) ;
$num = 5;//表示させたい件数
$i=0;
$desW = 40;
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');
}
//画像がない場合の指定
$first_img = trim($now_url,"/") . "../../../img/noimage.jpg";
//絵文字画像は除外
$blacklist = array(
"emoji.ameba.jp",
"stat100.ameba.jp/blog/ucs/img"
);
if( preg_match_all('/<img(.+?)>/is', $item->description, $matches) ){
    foreach( $matches[0] as $img ){
    $is_white = true;
    foreach ($blacklist as $path) {
    if (strpos($img, $path) !== false) {
    $is_white = false;
        }
    }
//最初の画像にマッチしたもの        
    if ($is_white && preg_match('/src=[\'"](.+?(?:jpg|png))[\'"]/i', $img, $m)) {
    $first_img = $m[1];
    }
    }
    }
?>
    <p><?php echo date( "Y/m/d", $timestamp); ?></p>
    <img src="<?php print $first_img; ?>" alt="<?php print $item->title; ?>" width="100">
    <a href="<?php echo $link; ?>" target="_blank"><?php echo $title; ?></a>
    <p class="text"><?php echo $description; ?></p>
    <?php
    $i++;
    }
    }
    ?>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

    上記に当てはまらず、質問内容が明確になっていない質問には「」機能からコメントをしてください。

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

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

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

回答 1

checkベストアンサー

+2

インデントがずれていて、見にくいので悩みましたが...

foreach( $matches[0] as $img ){

でループを回していますので、$matches[0] の数だけループします。

複数の画像がある場合、最初の画像を取得してからも次のループが回るので、条件に一致する画像が複数あると 何回も実行されて、$first_img が、上書きされますね。そのため、条件に一致した最後の画像が代入されているのだと思われます。

画像取得の条件に $first_img が空であるという条件を加えるか。または、$first_img に代入した後に break でループを抜けるようにする必要がありそうです。


           $first_img = $m[1];

の次の行に break;  といれて、 foreach ループを抜けるようにしたら 希望の動作にならないでしょうか。

投稿

編集

CHERRY

score 18036

  • 回答の評価を上げる

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

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

  • 回答の評価を下げる

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

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

  • sazami

    sazami

    2018/11/13 13:52

    ありがとうございます!できました!
    ループで上書きされていたのですね。知識が乏しく、そこに気がつきませんでした。
    $first_img = $m[1];
    break;
    とし、ループを抜ける事で解決できました。
    大変助かりました。感謝申し上げます。

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

  • ただいまの回答率 88.93%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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