第3回 PHPを利用してXMLを処理する方法 - マッシュアップ講座
ZAPA先生のマッシュアップ講座
Lecutures on PHP
第3回 PHPを利用してXMLを処理する方法 (その2)
PHP4で正規表現を使ってXMLを処理する方法
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);
長文のため難しいように感じてしまうかもしれませんが、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, $match, PREG_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
その他の記事も見る
- 第1回 Web サービス APIを使ってみる
- 第2回 マッシュアップサイトを作ってみる
- 第3回 PHPを利用してXMLを処理する方法
- 第4回 写真を表示するAPIを使ってみる
- 第5回 動画を表示するAPIを使ってみる
- 第6回 APIを組み合わせてマッシュアップサイトを作ってみる
- 第7回 キャッシュを導入して、快適なページ表示を実現する
- >>「ZAPA先生のマッシュアップ講座」一覧ページに戻る
- ZAPA先生
「ZAPAnet総合情報局」の管理人。
「公開API を利用したサンプルサイトを作っていくよ」にて、Web サービスAPI を利用したサイトを多数作り公開している。ブログ「[Z]ZAPA ブロ~グ2.0」で、プログラミングTIPS なども公開中。





ページのトップへ


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