目次
サンプル・プログラムの実行例
サンプル・プログラム
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>
引き数に与えられたアルファベットに現在日時が対応する。たとえば、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');
文字コードの詳しい話は「文字コードの話」をご覧いただきたい。
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: }
ちなみに、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行は、変数 $s に代入する。
このプログラムの目的は、ぱふぅ家のホームページの検索結果から記事見出しとハイパーリンクを抽出することである。
読み込んだ行には複数の見出しが含まれているが、各々は事前に設定した正規表現パターン $Pattern を有する。
そこで、読み込んだ行 $s に含まれるすべての見出しパターンを抽出するために、関数 preg_match を使う。
関数 preg_match は、引き数の正規表現パターンに合致する部分文字列を配列に格納する。
合致した部分文字列とは、すなわち記事見出しへのリンクである。そこで、逐次、部分文字列を表示させることでプログラムの目的を達する。この作業をテキストファイルの終わりまで繰り返す。
正規表現については、「PHPで正規表現」をあわせてご覧いただきたい。
関数 feof は、ファイルの終端まで来たら TRUE を、そうでなければ FALSE を返す。ここでは否定演算子 ! を付けて、ファイル終端に到達するまで while ループを回し、ファイルを読んで記事見出しを抽出・表示させる処理を続ける、という形になる。
ファイルを閉じる
63: //ファイル・クローズ
64: fclose($infp);
参考サイト
- PHPで正規表現:ぱふぅ家のホームページ
そこで今回は、ぱふぅ家のホームページの検索URLにアクセスし、タイトルとハイパーリンクを抽出して表示するプログラムを紹介する。
2004年(平成16年)11月に公開した最初のプログラムは、Googleニュースを読み込むものだったが、その後、Googleニュースのコンテンツ構造が複雑化してしまい、入門者向けに適したプログラムが作成できそうにないため、ぱふぅ家のホームページを読み込むプログラムに変更した。