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

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

ただいまの
回答率

90.51%

  • PHP

    23954questions

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

  • WordPress

    8906questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 535

sazami

score 4

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ページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2018/11/13 12:45

    ソースコードはマークダウンのcode機能を使ってください。質問・解説内容とコードとの境目が不明瞭となりますし、code機能では正しくコードをコピペできるようになりインデントもつけられて読みやすくなり、再現確認も容易となりますので、的確な回答が得やすくなります。https://teratail.com/help#about-markdown

    キャンセル

  • sazami

    2018/11/13 13:07

    大変失礼致しました。初めての利用のため、方法がよくわかっておりませんでした。ご指摘ありがとうございます。

    キャンセル

  • mts10806

    2018/11/13 13:15

    すみません。あとタグに「WordPress」を追加しておいてもらえると。PHPの知識よりWordPress自体の知識が必要になるケースの方が多いので

    キャンセル

  • sazami

    2018/11/13 13:20

    こちらこそたびたびすいません。タグ追加致しました。

    キャンセル

回答 1

checkベストアンサー

+2

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

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

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

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

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


           $first_img = $m[1];

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/13 13:52

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

    キャンセル

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

  • PHP

    23954questions

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

  • WordPress

    8906questions

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