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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

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

Q&A

2回答

2994閲覧

PHPでの複数のRSS取得表示について

naranara55_

総合スコア0

PHP

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

0グッド

0クリップ

投稿2020/05/10 21:32

前提・実現したいこと

phpで複数のrssを表示するものを作成したいと思い、他のサイトをほぼコピペして動作をさせてみたのですが
以下のようなエラーが出て、配列の一番最後のフィードだけが表示される状態になっています
どうすればいいのでしょうか。よろしくお願いします

発生している問題・エラーメッセージ

Warning: simplexml_load_string(): Entity: line 2: parser error : Start tag expected, '<' not found in ●●.php on line 13

該当のソースコード

<?php //フィード登録 $data['feedurl'][] = 'http://news.yahoo.co.jp/pickup/rss.xml'; //Yahoo!ニューストピックストップ $data['feedurl'][] = 'http://rss.rssad.jp/rss/itmnews/2.0/news_bursts.xml'; //ITmedia ニュース速報 $data['feedurl'][] = 'http://japan.cnet.com/rss/index.rdf'; //CNET Japan $data['feedurl'][] = 'http://feeds.reuters.com/reuters/JPTopNews'; //ロイター RSS // RSS追加用(いくつでも追加可能,Atom,RSS1.0,RSS2.0に対応) // $data['feedurl'][] = ''; $rssList = $data['feedurl']; //同時呼び出し $rssdataRaw = multiRequest($rssList); for($n=0; $n < count($rssdataRaw); $n++){ $rssdata = simplexml_load_string($rssdataRaw[$n]); //URL設定 // Atom取得 if($rssdata->entry){ $site = $rssdata->title; // サイト名 foreach($rssdata->entry as $myEntry){ $myTitle = $myEntry->title; // 日時取得 if (isset($myEntry->issued)) { $rssDate = $myEntry->issued; } else { $rssDate = $myEntry->published; } date_default_timezone_set('Asia/Tokyo'); $myDateGNU = strtotime($rssDate); $myDate = date('Y/m/d - G:i',$myDateGNU); //リンクURL取得 $myLink = $myEntry->link['href']; //サムネイル画像取得 $myContent = $myEntry->content; $imgurl = ""; $pattern = '/(ttps?)(://[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+).(jpg|gif|png)/'; if (preg_match_all($pattern, $myContent, $matches)) { foreach($matches[0] as $key=>$value) { $imgurl = "h{$value}"; } } else { $imgurl = "img/no-image.jpg"; // 画像が見つからなければno-image画像を挿入 } //連想配列($array) $array = array( "site" => $site, "title" => $myTitle, "url" => $myLink, "date" => $myDate, "image" => $imgurl, "visit" => 'none', ); $outdata[$myDateGNU] = $array; } } // rss1.0取得 elseif($rssdata->item){ $site = $rssdata->channel->title; //サイト名 foreach($rssdata->item as $myEntry){ $myTitle = $myEntry->title; // 日時取得 $rssDate = $myEntry->pubDate; if(!$rssDate) $rssDate = $myEntry->children("http://purl.org/dc/elements/1.1/")->date; date_default_timezone_set('Asia/Tokyo'); $myDateGNU = strtotime($rssDate); $myDate = date('Y/m/d - G:i',$myDateGNU); //リンクURL取得 $myLink = $myEntry->link; //サムネイル画像取得 $myContent = $myEntry->children("http://purl.org/rss/1.0/modules/content/")->encoded; $imgurl = ""; $pattern = '/(ttps?)(://[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+).(jpg|gif|png)/'; if (preg_match_all($pattern, $myContent, $matches)) { foreach($matches[0] as $key=>$value) { $imgurl = "h{$value}"; } } else { $imgurl = "img/no-image.jpg"; // 画像が見つからなければno-image画像を挿入 } //連想配列($array) $array = array( "site" => $site, "title" => $myTitle, "url" => $myLink, "date" => $myDate, "image" => $imgurl, "visit" => 'none', ); $outdata[$myDateGNU] = $array; } } // RSS2.0取得 elseif($rssdata->channel->item){ $site = $rssdata->channel->title; //サイト名 $rssdata = $rssdata->channel; foreach($rssdata->item as $myEntry){ $myTitle = $myEntry->title; // 日時取得 $rssDate = $myEntry->pubDate; if(!$rssDate) $rssDate = $myEntry->children("http://purl.org/dc/elements/1.1/")->date; date_default_timezone_set('Asia/Tokyo'); $myDateGNU = strtotime($rssDate); $myDate = date('Y/m/d - G:i',$myDateGNU); //リンクURL取得 $myLink = $myEntry->link; //サムネイル画像取得 $myContent = $myEntry->description; $imgurl = ""; $pattern = '/(ttps?)(://[-_.!~*\'()a-zA-Z0-9;/?:\@&=+$,%#]+).(jpg|gif|png)/'; if (preg_match_all($pattern, $myContent, $matches)) { foreach($matches[0] as $key=>$value) { $imgurl = "h{$value}"; } } else { $imgurl = "img/no-image.jpg"; // 画像が見つからなければno-image画像を挿入 } //連想配列($array) $array = array( "site" => $site, "title" => $myTitle, "url" => $myLink, "date" => $myDate, "image" => $imgurl, "visit" => 'none', ); $outdata[$myDateGNU] = $array; } } } //同時取得したRSSを更新日時順にソート krsort($outdata); //データをJSON形式に変換 $nn = 0; $output = ''; $length = count($outdata); foreach($outdata as $outdata) { $nn++; $output.= json_encode($outdata); if($nn !== $length) { $output.= ','; } else { break; } } // データをJSONに格納 $html = '['.$output.']'; $json = fopen('feeddata.json', 'w+b'); flock($json, LOCK_SH); fwrite($json, $html); fclose($json); //同時呼び出し関数 function multiRequest($data, $options = array()) { // array of curl handles $curly = array(); // data to be returned $result = array(); // multi handle $mh = curl_multi_init(); // loop through $data and create curl handles // then add them to the multi-handle foreach ($data as $id => $d) { $curly[$id] = curl_init(); $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d; curl_setopt($curly[$id], CURLOPT_URL, $url); curl_setopt($curly[$id], CURLOPT_HEADER, 0); curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1); // post? if (is_array($d)) { if (!empty($d['post'])) { curl_setopt($curly[$id], CURLOPT_POST, 1); curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']); } } // extra options? if (!empty($options)) { curl_setopt_array($curly[$id], $options); } curl_multi_add_handle($mh, $curly[$id]); } // execute the handles $running = null; do { curl_multi_exec($mh, $running); } while($running > 0); // get content and remove handles foreach($curly as $id => $c) { $result[$id] = curl_multi_getcontent($c); curl_multi_remove_handle($mh, $c); } // all done curl_multi_close($mh); return $result; } $output = []; $data = @file_get_contents('feeddata.json'); if ($data !== false) { $obj = json_decode($data); $output[] = '<ul>'; $zero = '0'; foreach (json_decode($data) as $obj) { $output[] = sprintf('<li>%s:<a href="%s">%s</a> (%s)</li>', $obj->site->$zero, $obj->url->$zero, $obj->title->$zero, $obj->date); } $output[] = '</ul>'; } ?> <!DOCTYPEhtml> <!-- RSSを表示 --> <?= count($output) > 0 ? implode(PHP_EOL, $output) : '' ?>

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

multiRequest関数で「ロイター RSS」以外の内容が取得できていないようです。

投稿2020/05/10 22:16

satokei

総合スコア1217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

2番目のURLがブラウザから直でアクセスできませんが、エラーはそれが原因では?

投稿2020/05/10 21:47

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naranara55_

2020/05/10 21:54

盲点でした・・・ しかしその箇所を修正しても同じエラーが出てきました 何故なのでしょう
m.ts10806

2020/05/10 21:58

何をどう修正したのでしょう。 Warningはエラーとは違うので、コードは中断されず実行されていっているはずです。 ということは、どの時点でWarningとなっているか調べることができます。 どのXMLのときに起きてるかデバッグしてみてください。
naranara55_

2020/05/10 22:24

2番目の$data['feedurl'][] = 'http://rss.rssad.jp/rss/itmnews/2.0/news_bursts.xml'; //ITmedia ニュース速報部分を丸ごと削除しました その状態で Warning: simplexml_load_string(): Entity: line 2: parser error : Start tag expected, '<' not found in xx.php on line 12と表示される状態です また類似の物を試していたのですが、そちらでもmultiRequest関数の部分で引っかかっているようでした 現在無料のレンタルサーバーを使用しているためもしかするとサーバー側の制限によるものなのでしょうか
m.ts10806

2020/05/10 22:48

質問は編集できるので、対応状況追記してください。 無料のレンタルサーバーだと何かしら制限がある可能性はなくもないですが、問題切り分けするために、自身のローカルPCでもやってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問