PHP4でXMLを取得してページに表示する方法と複数記事の表示方法

このQ&Aのポイント
  • PHP4を使用してXMLを取得し、ページに表示する方法を紹介します。また、複数記事を表示させる方法も説明します。
  • XMLデータを取得するためのベースURLを指定し、file_get_contents関数を使用してXMLファイルを読み込みます。その後、正規表現を使用して記事のタイトル、リンク、概要、カテゴリーなどを抽出します。
  • <dc:type>が「番付」の記事のみを抜き出す方法も紹介します。正規表現パターンに<dc:type>番付</dc:type>を追加し、マッチした記事のみを表示できます。
回答を見る
  • ベストアンサー

php4でxmlを取得してページに表示

http://www.phppro.jp/school/mashup/vol3/2 を参考に以下コードを書いたのですが、記事を1件表示させるだけでなく別の記事も複数件表示させたい場合はどうすれば良いのでしょうか。 また、<dc:type>番付</dc:type>のものだけを抜き出す方法も教えていただけると嬉しいです。宜しくお願い致します。 <?php function news(){ //XMLデータ取得用ベースURL $req = "http://polls.dailynews.yahoo.co.jp/rss.xml"; //XMLファイル内容を全て文字列に読み込む $buf = file_get_contents($req); preg_match_all('@<item>.*?<title>(.*?)</title>.*?<link>(.*?)</link>.*?<description>(.*?)</description>.*?<dc:subject>.*?</dc:subject>.*?<dc:type>(.*?)</dc:type>.*?</item>@s', $buf, $match, PREG_SET_ORDER); $ret .= "<h1><a href=\"".$match[0][2]."\">".$match[0][1]."</a></h1>"; $ret .= "<div>".$match[0][3]."【".$match[0][4]."】</div>"; return $ret; } echo news(); ?>

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

<?php function news(){ //XMLデータ取得用ベースURL $req = "http://polls.dailynews.yahoo.co.jp/rss.xml"; //XMLファイル内容を全て文字列に読み込む $buf = file_get_contents($req); preg_match_all('@<item>.*?<title>(.*?)</title>.*?<link>(.*?)</link>.*?<description>(.*?)</description>.*?<dc:subject>.*?</dc:subject>.*?<dc:type>(.*?)</dc:type>.*?</item>@s', $buf, $match, PREG_SET_ORDER); $ret = ""; for ($i = 0;$i < count($match);$i++){ $ret .= "<h1><a href=\"".$match[$i ][2]."\">".$match[$i ][1]."</a></h1>"; $ret .= "<div>".$match[$i ][3]."【".$match[$i ][4]."】</div>"; } return $ret; } echo news(); ?> <?php function news(){ //XMLデータ取得用ベースURL $req = "http://polls.dailynews.yahoo.co.jp/rss.xml"; //XMLファイル内容を全て文字列に読み込む $buf = file_get_contents($req); preg_match_all('@<dc:type>(.*?)</dc:type>@s', $buf, $match, PREG_SET_ORDER); $ret = "<ul>"; for ($i = 0;$i < count($match);$i++){ $ret .= "<li>" . $match[$i ][1] . "</li>"; } $ret .= "</ul>"; return $ret; } echo news(); ?> #…と,一応書いたけど #前回(Q4338700)の時も思っていたんですが,俺この手法大嫌いなんですよね。 #絶対にどこかでミスする。 サーバ側のプログラム変更等により色々なパーザーを経由しているうちに 【名前空間接頭辞が変更されない保証はない】し, 【異なる名前空間に対して同一の名前空間接頭辞が使われない保証もない】し, 【そもそもこのコードは http://oshiete1.goo.ne.jp/qa3684051.html の手のものには一切対応してないが, XMLとしては等価ものなので使われても文句は言えない。】 ざっと考えただけでこれだけあるんだ。まだまだあるに違いない。 #XMLを正規表現でいじるタイプのものへの回答は嫌悪感が物凄い

mooooooood
質問者

お礼

前回に続き、ありがとうございます。 正規表現だと問題がいろいろあるんですね。 他の方法も検討してみることにします。

関連するQ&A

  • PHP4.4.8でxmlを表示する方法

    PHP Version 4.4.8 Apache 2.0 Handler 上記環境でxmlをphpで参照する方法を探しているのですが http://www.phppro.jp/school/mashup/vol3/2 のソースコードをそのまま貼って試してみたら ------------------------------ ライブドアの天気予報を表示する 最高気温度 最低気温度 ------------------------------ としか表示されませんでした。どなたか解決法を教えて頂けないでしょうか。 <?php //ライブドアの天気予報を表示する関数その2 function lwws2($city,$day){ //XMLデータ取得用ベースURL $req = "http://weather.livedoor.com/forecast/webservice/rest/v1"; //XMLデータ取得用リクエストURL生成 $req .= "?city=".$city."&day=".$day; //XMLファイル内容を全て文字列に読み込む $buf = file_get_contents($req); preg_match_all('@<title>(.*?)</title>.*?<description>(.*?)</description>.*?<image>.*?<title>(.*?)</title>.*?<url>(.*?) </url>.*?</image>.*?<temperature>.*?<max>.*?<celsius>(.*?)</celsius>.*?</max>.*?<min>.*?<celsius>(.*?)</celsius>.*?</min>.*?</temperature>@s', $buf, $match, PREG_SET_ORDER); $ret = '<div class="lwws">'; $ret .= "<div>".$match[0][1]."</div>"; $ret .= "<div><img src=\"".$match[0][4]."\" alt=\"".$match[0][3]."\"></div>"; $ret .= "<div>".$match[0][2]."</div>"; $ret .= "<div>最高気温".$match[0][5]."度</div>"; $ret .= "<div>最低気温".$match[0][6]."度</div>"; $ret .= "</div>"; return $ret; } echo "<h1>ライブドアの天気予報を表示する</h1>\n"; //リクエストパラメータ設定 $city = "63"; //東京を設定 $day = "tomorrow"; //tomorrow(明日の天気)を設定 //ライブドアの天気予報を表示する関数をコールする echo lwws2($city,$day); ?>

    • ベストアンサー
    • PHP
  • PHP4でXML

    こんにちは。PHPでXMLファイルを書き換えたいのですが、サーバ環境がPHP5ではありません。以下のようにHTMLと同じ方法でphpファイルを読み込むことは不可能なのでしょうか?だとしたら他に良い方法はありますか?困っています。どなたか助けてください。よろしくお願いします。 <?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>○○1</title> <link>http://○○</link> <description>ウェブサイトに掲載されている最新の情報を掲載しております。</description> <language>ja</language> <copyright>Copyright (c) 2007 ○○, Inc. All Rights Reserved.</copyright> <pubDate><?php include("../rss/date.php"); ?></pubDate> <item> <title>ニュースリリース</title> <link>http://○○</link> <description><?php include("../rss/news.php"); ?></description> <pubDate><?php include("../rss/date.php"); ?></pubDate> </item> <item> <title>商品一覧ページ</title> <link>http://○○</link> <description><?php include("../rss/prodact.php"); ?></description> <pubDate><?php include("../rss/date.php"); ?></pubDate> </item> <item> <title>沿革</title> <link>http://○○</link> <description><?php include("../rss/corporation.php"); ?></description> <pubDate><?php include("../rss/date.php"); ?></pubDate> </item> </channel> </rss>

    • 締切済み
    • XML
  • XMLのエラー

    XMLのエラー RSS作りの勉強のため、XMLを作成していったんローカルフォルダに保存したあと、IE8でテスト表示してみたるとこんなエラーが出ます。↓↓ XML ページを表示できません XSL スタイル シートを使用した XML 入力は表示できません。エラーを訂正してください。 [更新] ボタンをクリックするか、または後でやり直してください。 -------------------------------------------------------------------------------- テキストの内容に無効な文字が見つかりました。リソース 'file:///(ファイルの保存場所)' の実行エラーです。 XMLの文は下です。 <?xml version="1.0" encoding="utf-8" ?> <rss version="2.0"> <channel>   <title>RSS2.0 Test</title>   <link>(適当なリンク先)</link>   <description>RSS2.0のテスト</description>   <language>ja</language>   <item>    <title>ページ1</title>    <link>(適当なリンク先)</link>    <description>1つ目のページ</description>    <pubDate>Mon, 20 Jul 2010 00:00:00 +0900</pubDate>   </item>   <item>    <title>ページ2</title>    <link>(適当なリンク先)</link>    <description>2つ目のページ</description>    <pubDate>Tue, 21 Jul 2010 03:04:05 +0900</pubDate>   </item> </channel> </rss> よろしくお願いします。

    • ベストアンサー
    • XML
  • preg_matchの正規表現がうまくいかない

    たとえば、http://gehasoku.com/?p=2のソースコードには ------------------- <rdf:Description rdf:about="http://www.com/aaa.html" trackback:ping="http://www.com" dc:title="タイトル" dc:identifier="http://iii.com/bbb.html" dc:subject="ハードウェア" dc:description="1 名前:名無しさん " dc:creator="soft_net" dc:date="2012-02-21T20:05:01+09:00" /> ------------------- のような形の<rdf:Description~~~/>タグの情報ががいくつかあると思います。これらすべてを文字列として取得したくて、次のようなphpを作成しましたが、うまく動作しません。 原因はどうやらpreg_match_allの正規表現がうまくいっていないからのようですので、 <rdf:Description~~~/>を抜き出すことができる正規表現を教えてください。 自分でもここでチェックしながらやりましたが、 http://www.rider-n.sakura.ne.jp/regexp/regexp.php <rdf:Description~をマッチすることはできても、/>で閉じることができませんでした。 よろしくお願いします。 <?php $url="http://gehasoku.com/?p=2"; $html=file_get_contents($urls); preg_match_all("/<rdf:Description(.*)?\/>/",$html,$match); print_r($match); foreach($match[1] as $value){ echo $value; } ?>

    • ベストアンサー
    • PHP
  • xhtmlの最初の行に半角スペースが入ってしまいます(APIの天気予報を、PHP+smarty〔xhtml〕で表示したい)

    APIの天気予報を、PHP+smartyで表示しようと思います。しかし表示された画面のソースを見ると、xhtmlの最初の行に半角スペースが入って、htmlと認識されてしまいます。原因は以下のファイルのようなのですが、なにか原因がありますでしょうか?ちなみに、<?phpはファイルの先頭に、?>の後の改行はありません、文字コードはutf-8bom無しです 以下のファイルにidをpostしています。どうかご教授いただけないでしょうか?.......................................................... $documentroot = dirname( __FILE__) . '/'; require_once $documentroot . '../../php_libs/config/config.inc.php'; require_once("jsphon2/Jsphon.php"); require_once ("Net/UserAgent/Mobile.php"); require_once ("Net/IPv4.php"); require_once( _SMARTY_LIBS_DIR . "Smarty.class.php"); $smarty = new Smarty(); $smarty->template_dir = _SMARTY_TEMPLATES_DIR; $smarty->compile_dir = _SMARTY_TEMPLATES_C_DIR; $smarty->config_dir = _SMARTY_CONFIG_DIR; $smarty->cache_dir = _SMARTY_CACHE_DIR; $smarty->caching = 2; if(isset($_POST['id'])){ //ライブドアの天気予報を表示する関数 function lwws($city,$day){ //XMLデータ取得用ベースURL $req = "http://weather.livedoor.com/forecast/webservice/rest/v1"; //XMLデータ取得用リクエストURL生成 $req .= "?city=".$city."&day=".$day; //XMLファイルをパースし、オブジェクトを取得 $xml = simplexml_load_file($req) or die("XMLパースエラー"); $lwwsarea = $xml->pinpoint->location->title; $lwwstitle = $xml->title; $lwwsimage = $xml->image->url; $lwwsalt = $xml->image->title; $lwwsmax = $xml->temperature->max->celsius; $lwwsmin = $xml->temperature->min->celsius; $lwwsdescription = $xml->description; $ret = '<div class="lwws">'; $ret .= '<div>'.'<span style="color:#ff0000;"></span>'.$lwwsarea.'の天気</div>'; $ret .= '<div style="background-color:#fce6f3">'.$lwwstitle."</div>"; $ret .= "<br /><div><img src=\"".$lwwsimage."\" alt=\"".$lwwsalt."\" /></div>"; $ret .= "<div>最高気温".$lwwsmax."度</div>"; $ret .= "<div>最低気温".$lwwsmin."度</div>"; $ret .= "<div>".$lwwsdescription."</div>"; $ret .= "</div>"; return array ($ret,$lwwsarea,$lwwstitle); } function lwws2($city,$day){ //XMLデータ取得用ベースURL $req = "http://weather.livedoor.com/forecast/webservice/rest/v1"; //XMLデータ取得用リクエストURL生成 $req .= "?city=".$city."&day=".$day; //XMLファイルをパースし、オブジェクトを取得 $xml = simplexml_load_file($req) or die("XMLパースエラー"); $ret = '<div class="lwws2">'; $ret .= '<div style="background-color:#fce6f3">'.$xml->title."</div>"; $ret .= "<br /><div><img src=\"".$xml->image->url."\" alt=\"".$xml->image->title."\" /></div>"; $ret .= "<div>最高気温".$xml->temperature->max->celsius."度</div>"; $ret .= "<div>最低気温".$xml->temperature->min->celsius."度</div>"; $ret .= "<br />"; $ret .= "</div>"; return $ret; } //リクエストパラメータ設定 $city = $_POST['id']; //場所を設定 $day = "today"; //今日の天気 $day2 = "tomorrow"; $day3 = "dayaftertomorrow"; //ライブドアの天気予報を表示する関数をコールする list($ret, $lwwsarea1, $lwwstitle1) = lwws($city,$day); $ret2 = lwws2($city,$day2); $ret3 = lwws2($city,$day3); //キャッシュの残り時間を生成 $now=time() +(60 * 24); $asu=time() +(60 * 60 * 24); $y=date("Y", $asu); $m=date("m", $asu); $d=date("d", $asu); $asu_byou= mktime(0, 0, 0, $m, $d, $y); $sa= $asu_byou - $now; } $smarty-> assign ('lwws1' , $ret); $smarty-> assign ('lwws2' , $ret2); $smarty-> assign ('lwws3' , $ret3); $smarty-> assign ('lwwsarea', $lwwsarea1); $smarty->assign('city', $city); $cache_id = $city; //あすの0:00までの秒数をセットする $smarty->cache_lifetime = $sa; if ($smarty->is_cached("weather.tpl", $cache_id)){ $smarty->display("weather.tpl", $cache_id); exit(); } $smarty->display("weather.tpl", $cache_id);

    • ベストアンサー
    • PHP
  • XMLデータを動的に使用する

    XML初心者です。 お恥ずかしながらかなり幼稚な質問かもしれませんが宜しくお願いします。 XMLファイルがひとつあります。 ----ファイルの中身---- <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="相対パス/fff.xsl"?> <rss version="2.0"> <channel> <item> <title>お中元の季節になりました。</title> <link>https://XXXX/XXXXX</link> <pubDate>2007/07/05</pubDate> <description>お中元の季節になりました。デパートが賑わいをみせています。</description> <category>浅目新聞</category> </item> <item> <title>今年は平年並みの暑さ</title> <link>https://XXXX/XXXXX</link> <pubDate>2007/07/05</pubDate> <description>気象庁が今年は平年並みの暑さになると発表しました。</description> <category>毎回新聞</category> </item> </channel> </rss> XSLファイルがあります。 ----ファイルの中身---- <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>新聞情報表示テスト</title> </head> <body> <p align="center">表示テスト</p> <xsl:apply-templates /> </body> </html> </xsl:template> <xsl:template match="item"> <table border="0" width="500" align="center"> <xsl:if test="title='お中元の季節になりました。'"> <tr> <td colspan="2">URL: <xsl:value-of select="link" /></td> </tr> </xsl:if> </table> </xsl:template> </xsl:stylesheet> このXSLファイルについて、"お中元"の部分を動的に変えたいのですが、可能でしょうか? できればjavascriptは使いたくありません。(javascriptを無効にしているユーザーがいるため) インプットボックスが用意してあり、そこにユーザーが"今年は平年並みの暑さ"と入力すれば、そちらのlinkを引っ張ってきたいのです。 かなり抽象的な質問になってしまい、みなさんに意図を汲み取って頂かなければなりませんが、困っていますので宜しくお願いします。

    • ベストアンサー
    • XML
  • RSS自動生成で文字化け

    XML::RSSでRSSファイルを自動生成後のファイルが文字化けします。 webサーバーのキャラセットはコメントアウトしています。 キャラセットをAddDefaultCharset UTF-8にしても文字化けします。 スクリプトは下記でテストしています。 文字コードですが、UTF-8Nであれば、ファイルが生成されます。 生成されたファイルは文字化けしています。 ご教授お願いいたします。 #!/usr/bin/perl use XML::RSS; use strict; my $rss = new XML::RSS(version => "1.0"); my $rssdata = [ { title => "RSSテストその1", link => "http://www.*******.***/rsstest", description => "RSSテストその1です。", dc => { subject => "rsstest", creator => "rsstest", date => "2007-06-12T00:00:01+09:00", } }, ]; $rss->channel( title => "*******.***", link => "http://www.*******.***", description => "RSSテスト", dc => { creator => "rsstest", date => "2007-06-12T00:00:00+09:00", subject => "RSSのテストです", }, ); foreach(@{$rssdata}){ $rss->add_item( title => $_->{title}, link => $_->{link}, description => $_->{description}, dc => { subject => $_->{dc}->{subject}, creator => $_->{dc}->{creator}, date => $_->{dc}->{date} } ); } $rss->save("rss.xml");

    • ベストアンサー
    • Perl
  • PHPでheader情報がうまく表示できない

    ドコモ対応でXHTMLのヘッダー情報がうまく送れません。 PCからのテストで header('Content-Type: application/xhtml+xml'); をコード挿入すし、サイト表示の確認すると「ファイルのダウンロード 」ダイアログがでます。 header('Content-Type: application/xhtml+xml'); を入れずにテストするとダイアログはでません。 ・display.phpがメインページであくまでもskin.htmlをインクルードして置換しecho表示する感じなのですが・・・・・ 困っています。助けて下さい。 skin.html ----------------- <html> <body> <head> <!--%title--> </head> <body> コンテンツ </body> </html> ----------------- test.php -------------------------------------------------------------------------------------- 変数定義は省略 $html = file_get_contents($temp); $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ $html = str_replace( "<!--%title-->", $docomo, $html); header('Content-Type: application/xhtml+xml'); echo "$html"; } elseif(preg_match("/^(J\-PHONE|Vodafone|MOT\-[CV]|SoftBank)/i", $agent)){ $html = str_replace( "<!--%title-->", $softbank, $html); header('Content-Type: application/xhtml+xml'); echo "$html"; } elseif(preg_match("/^KDDI\-/i", $agent) || preg_match("/UP\.Browser/i", $agent)){ $html = str_replace( "<!--%title-->", $au, $html); header('Content-Type: application/xhtml+xml'); echo "$html"; } else{ $html = str_replace( "<!--%title-->", $other, $html); header('Content-Type: application/xhtml+xml'); echo preg_replace('/{.*?}/', '', $html); -------------------------------------------------------------------------------------- display.php ------------------------------------------ <?php $temp = "./skin.html"; require_once('./test.php'); ?>

    • ベストアンサー
    • PHP
  • 外部XMLのテキスト表示

    WinXP、FLASH MX2004Proで編集しています。 FLASHで外部XMLを読み込んで、テキストを表示させたいと思っています。 XMLファイルはnews.xmlで、 -------------------- <?xml version="1.0" encoding="Shift_JIS" ?> <news> <item> <title>NEWSその1</title> <link>http://www.news01.com</link> </item> <item> <title>NEWSその1</title> <link>http://www.news02.com</link> </item> </news> </xml> -------------------- です。DWで作成したので、Shift-Jisで間違いないと思います。 FLASHでは、ステージ上にダイナミックテキストを配し、インスタンス名・変数名ともに「title_text」にしています。 また、フレームには以下のASを書いています。 -------------------- System.useCodepage = true; newsXML = new XML(); newsXML.load("news.xml"); newsXML.ignoreWhite = true; newsXML.onLoad = function(success) { total = newsXML.firstChild.childNodes.length; title_text.text = newsXML.firstChild.childNodes.firstChild.nodeValue; }; --------------------- 「NEWSその1」が表示されて欲しいところですが、実際には、 「undefind」 です。 ちなみに、 newsXML.onLoad = function(success) { if(success){trace("OK");}else{tarace("NG");} ・・・ としてみたら、「OK」が出力されました。 trace(total); では、「2」が出力されます(あってます)。 しかし、 trace(title_text); は、「undefind」です。 ぜひお力お貸しください。 お願いします。

    • ベストアンサー
    • Flash
  • FC2ブログで記事の投稿日時を表示させたい

    FC2ブログで、grey_2columnというテンプレートを使っているのですが、記事を書いた日にちまでしか表示されません。 <%topentry_second>まであるのですが、記事を書いた時間まで表示させるにはどうすればいいでしょうか。 2000文字を超えてしまうので一部しか載せられませんが、よろしくおねがいします。 </ul> <!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:dc="http://purl.org/dc/elements/1.1/"> <rdf:Description rdf:about="<%topentry_link>" trackback:ping="<%url>tb.php/<%topentry_tb_no>" dc:title="<%topentry_title>" dc:identifier="<%topentry_link>" dc:subject="<%topentry_category>" dc:description="<%topentry_discription>" dc:creator="<%author_name>" dc:date="<%topentry_year>-<%topentry_month>-<%topentry_day>T<%topentry_hour>:<%topentry_minute>:<%topentry_second>+09:00" /> </rdf:RDF> --> <div class="pagetop"><a href="#container" title="<%template_go_top>">Pagetop</a></div> </div><!--/content--> <!--/topentry--> <!--/not_titlelist_area--> <!--/not_search_area-->