PHPでURL上のコンテンツを読み込む

(1/1)
PHPは、もちろんファイル操作を行うことができるが、面白いのは、ローカルマシンにあるファイルと、インターネット上のコンテンツを同等に扱うことができる点だ。
そこで今回は、ぱふぅ家のホームページの検索URLにアクセスし、タイトルとハイパーリンクを抽出して表示するプログラムを紹介する。

2004年(平成16年)11月に公開した最初のプログラムは、Googleニュースを読み込むものだったが、その後、Googleニュースのコンテンツ構造が複雑化してしまい、入門者向けに適したプログラムが作成できそうにないため、ぱふぅ家のホームページを読み込むプログラムに変更した。

目次

サンプル・プログラムの実行例

PHPでURL上のコンテンツを読み込む

サンプル・プログラム

圧縮ファイルの内容
search_pahoo.phpサンプル・プログラム本体
search_pahoo.php 更新履歴
バージョン 更新日 内容
4.0.0 2023/04/29 ぱふぅ家のホームページの新着情報表示に切り替え
3.0 2021/02/13 ぱふぅ家のホームページに切り替え.PHP8対応
2.5 2017/03/19 GoogleニュースのURL変更
2.4 2014/07/12 HTML5に対応
2.3 2014/03/30 最新のGoogle Newsに対応

解説:時刻に関する注意事項

   8: <h2>ぱふぅ家のホームページの新着情報表示</h2>
   9: <h3><?date("Y年n月j日G時\n"?></h3>

関数  date  は、現在のローカル時間を扱う組み込み関数だ。
引き数に与えられたアルファベットに現在日時が対応する。たとえば、nは月の数字(ゼロを付けない)、jは日の数字(ゼロを付けない)、Gは24時制の時の数字(ゼロを付けない)である。この他、さまざまな表示書式があるので、 関数  date  をご覧いただきたい。ここで関数dateはHTMLの中に組み込まれている。

PHPプログラムを含むHTMLでは、<?=式 ?> のように略記法を使うことで、HTMLの中でPHPの式を実行することができる。単に変数や関数の値を表示するだけなら、この略記法が便利だろう。ここで1つ問題がある。
関数 date は、PHPが動作しているサーバのローカル時間を返すため、もし海外のサーバでこのプログラムを動かすと、サーバのある現地時間が表示されることになる。
目的からいけば ぱふぅ家のホームページの時間を表示させるべきなので、サーバ時間から日本標準時を計算し、表示する必要がある。通常、サーバ時間を世界標準時に変換し、それから日本標準時に変換する。
PHPには関数 date と同等で、世界標準時(グリニッジ標準時)を返す関数  gmdate  がある。そこで、date の代わりに gmdate を用い、それに9時間加算して日本標準時を表示させるとよい。
この部分は各自挑戦してみてほしい。

変数 $InputFile は、ぱふぅ家のホームページをキーワード検索するページのURLである。検索キー "PHP" を指定して、変数に代入しておく。

変数 $Pattern は、ぱふぅ家のホームページの検索結果から抽出する部分を検索するための正規検索パターンである。詳細は後で述べる。

解説:文字コードの扱い

  21: //内部エンコーディング
  22: mb_internal_encoding('UTF-8');

インターネットで日本語を使う場合、複数の文字コードがあることはご存じの通り。代表的なのは、Windowsで使われている シフトJIS、UNIX系で使われている EUC-JP、そして国際標準であるUNICODE(UTF-8)など。これを間違えると、表示の文字化けを起こしたりする。
文字コードの詳しい話は「文字コードの話」をご覧いただきたい。

PHPでテキストファイルを扱う場合、まず、そのファイルの文字コードに注意する。
ぱふぅ家のホームページUTF-8 で記述されているので、 プログラムの冒頭で関数  mb_internal_encoding  を使い、内部処理で UTF-8 を使うことを宣言する。もし文字コードがEUCなら"EUC"と、UTF-8なら"UTF-8"と記述すればよい。
PHPのマニュアルによると、シフトJISでの動作は保証していないとあるが、この程度のプログラムでは問題なく動作するようだ。(より複雑なプログラムでは、すべてのテキストをEUC-JPに変換する必要があるかもしれない)

解説:ファイルのオープン

  41: //ファイル・オープン
  42: if (isphp5over()) {
  43:     //PHP5以上では証明書の検証を無効化
  44:     $ctx = stream_context_create(array('ssl' => array('verify_peer' => FALSE)));
  45:     $infp = fopen($InputFile, 'r', FALSE, $ctx);
  46: else {
  47:     $infp = fopen($InputFile, 'r');
  48: }

インターネット上のコンテンツを読み込むために、まず、関数  fopen  を使って“読み込み”オープンする必要がある。引き数はURLである。
ちなみに、PCのローカルディスクにあるファイルをオープンする場合も関数  fopen  を使う。
なお、当サイトが稼働しているサーバの都合上、証明書の検証を無効化している。

正常にファイルがオープンできると、関数  fopen  はリソース番号を返す。今後、このファイルへのアクセスはリソース番号を介して行うことになるので、リソース番号を変数 $fp に保存しておく。
関数  fopen  はエラーを発生する場合がある。たとえば、引き数に指定されたファイルがない場合(HTTPサーバの404エラー)などだ。そこで、エラー対処も記述しておく。
関数  fopen  は、エラー発生時に FALSE を返す。もし変数$fpがFALSEだったら、エラー表示を行い、関数  exit  によってプログラムを強制終了する。

解説:ファイルを読んで記事見出しを抽出する

  54: //コンテンツを1行ずつ読み込んで,パターンマッチした行を画面表示する.
  55: while (! feof($infp)) {
  56:     $s1 = fgets($infp);
  57:     if (preg_match($Pattern, $s1, $arr> 0) {
  58:         $s2 = fgets($infp);
  59:         echo '<li><a href="' . $arr[1. '" target="_blank">';
  60:         echo  $s2 . "</a><br>\n";
  61:     }
  62: }

テキストファイルを1行読み込むのは、関数  fgets  である。引き数はfopen関数で取得したりソース番号 $fp だ。
読み込んだ1行は、変数 $s に代入する。

このプログラムの目的は、ぱふぅ家のホームページの検索結果から記事見出しとハイパーリンクを抽出することである。
読み込んだ行には複数の見出しが含まれているが、各々は事前に設定した正規表現パターン $Pattern を有する。
そこで、読み込んだ行 $s に含まれるすべての見出しパターンを抽出するために、関数  preg_match  を使う。
関数  preg_match  は、引き数の正規表現パターンに合致する部分文字列を配列に格納する。
合致した部分文字列とは、すなわち記事見出しへのリンクである。そこで、逐次、部分文字列を表示させることでプログラムの目的を達する。この作業をテキストファイルの終わりまで繰り返す。
正規表現については、「PHPで正規表現」をあわせてご覧いただきたい。

関数  feof  は、ファイルの終端まで来たら TRUE を、そうでなければ FALSE を返す。ここでは否定演算子 ! を付けて、ファイル終端に到達するまで while ループを回し、ファイルを読んで記事見出しを抽出・表示させる処理を続ける、という形になる。

ファイルを閉じる

  63: //ファイル・クローズ
  64: fclose($infp);

fopen関数で閉じたファイルは、最後に、関数  fclose  によって閉じなければならない。

参考サイト

(この項おわり)
header