第3回 PHPを利用してXMLを処理する方法 - マッシュアップ講座

PHP基礎編

ZAPA先生のマッシュアップ講座

Lecutures on PHP

第3回 PHPを利用してXMLを処理する方法 (その2)

 このエントリーをはてなブックマークに追加

PHP4で正規表現を使ってXMLを処理する方法

ZAPA先生PHP5を利用する場合にはSimpleXML関数というXML処理のためのとても便利な関数があることを紹介しました。しかし、残念ながらPHP4ではSimpleXML関数が使えないため、他の方法でXMLを処理する必要があります。PHP4にはXMLパーサ関数というXMLドキュメント構文解析用の関数が用意されていますが、少し複雑な処理が必要であるため、あまりオススメできません。

ここでは、XML パーサ関数を使わずに汎用性の高い正規表現を使ったXML処理方法を解説します。

まず、お天気Webサービスのリクエスト用URLを生成した後、file_get_contents関数を使って取得したXMLファイルの内容を全て文字列に読み込みます。

$buf = file_get_contents(“リクエスト用URL”);

そして、preg_match_all関数を使って繰返し正規表現検索を行います。この関数の書式は以下になります。

preg_match_all ( string pattern, string subject, array &matches [, int flags [, int offset]] )

例えば、レスポンスとして返ってきた天気予報情報から天気アイコンのURLを抜き出して表示するには以下のようにします。

$buf = file_get_contents(“リクエスト用URL”);
preg_match_all('@<image>.*?<url>(.*?)</url>.*?</image>@s', $buf, $match, PREG_SET_ORDER);
echo $match[0][1];

まず、file_get_contents 関数でXML を取得して$buf に代入します。次に、天気アイコンのURL情報を示すimageタグ内のurlタグにマッチする部分を正規表現で抜き出して、$match配列に代入します。この場合、天気アイコンのURLは$match[0][1]に代入されます。この$match[0][1]を表示すると、例えば、

http://image.weather.livedoor.com/img/icon/9.gif

のように表示されます。 前節のPHP5利用時に取得した情報と同じ情報を抜き出すには、以下のような正規表現を組めば取得できます。

preg_match_all('@<title>(.*?)</title>.*?<description>(.*?)</description>.*?<i
mage>.*?<title>(.*?)</title>.*?<url>(.*?)</url>.*?</image>.*?<temperature>.*?
<max>.*?<celsius>(.*?)</celsius>.*?</max>.*?<min>.*?<celsius>(.*?)</celsius>.
*?</min>.*?</temperature>@s', $buf, $match, PREG_SET_ORDER);

ZAPA先生長文のため難しいように感じてしまうかもしれませんが、XMLを処理するための正規表現パターンはそれほど複雑ではありません(同じようなパターンの繰り返しで対応できます)。正規表現を使ったXML処理は、一度覚えてしまえばどのようなXMLファイルにも対応できるため、覚えておいて損はないはずです。もちろん、PHP4に限らず、PHP5でも利用できる便利なテクニックです。

以下のリスト2は、正規表現を使ってXMLを処理するlwws2関数のサンプルになります。

● リスト2 lwws2関数の内容
   1  //ライブドアの天気予報を表示する関数その2
   
2  function lwws2($city,$day){
   
3    //XMLデータ取得用ベースURL
   
4    $req "http://weather.livedoor.com/forecast/webservice/rest/v1";
   
5      
   6    
//XMLデータ取得用リクエストURL生成
   
7    $req .= "?city=".$city."&day=".$day;
   
8   
   9    
//XMLファイル内容を全て文字列に読み込む
  
10    $buf file_get_contents($req);    
  
11    preg_match_all('@<title>(.*?)</title>.*?<description>(.*?)</descript
ion>.*?<image>.*?<title>(.*?)</title>.*?<url>(.*?) </url>.*?</image>.*?<temp
erature>.*?<max>.*?<celsius>(.*?)</celsius>.*?</max>.*?<min>.*?<celsius>(.*?
)</celsius>.*?</min>.*?</temperature>@s'
$buf$matchPREG_SET_ORDER);
  
12      
  13    $ret 
'<div class="lwws">';
  
14    $ret .= "<div>".$match[0][1]."</div>";
  
15    $ret .= "<div><img src=\"".$match[0][4]."\" alt=\"".$match[0]
                [
3]."\"></div>";
  
16    $ret .= "<div>".$match[0][2]."</div>";
  
17    $ret .= "<div>最高気温".$match[0][5]."度</div>";
  
18    $ret .= "<div>最低気温".$match[0][6]."度</div>";
  
19    $ret .= "</div>";
  
20      
  21    
return $ret;
  
22  
  23  
}

※上記リストの11行目のソースコードに関しましては、そのままコピー&ペーストをされますと、不要な改行やスペースが挿入されてしまうため、実装される場合は不要な改行やスペースを消去してください。

リスト1のプログラム内のlwws関数に置き換えて、このlwws2関数をコールすると、PHP5で実行した結果と同じように表示されるはずです。

次回の講座では、写真を表示するAPIの利用方法について解説していきます。

  • 1
  • 2
  • ZAPA先生

ZAPAnet総合情報局」の管理人。

「公開API を利用したサンプルサイトを作っていくよ」にて、Web サービスAPI を利用したサイトを多数作り公開している。ブログ「[Z]ZAPA ブロ~グ2.0」で、プログラミングTIPS なども公開中。

ご意見・感想フォーム

今回の「ZAPA先生のマッシュアップ講座」への評価・ご意見があればご記入下さい。

評価:
ご意見・感想:

  



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)