PHPでHTMLコンテンツをテキスト・ファイルに変換する

(1/1)
PHP を用いると、HTML コンテンツを簡単にテキスト・ファイルに変換することができる。また、EUC や UTF-8 で記述されたコンテンツをシフト JIS に変換することも簡単にできる。
そこで今回は、インターネット上の HTML コンテンツをシフト JIS のテキスト・ファイルに変換するプログラムを作ってみることにする。

サンプル・プログラム

プログラムを実行すると、URL を入力するテキストボックスが表示される。
変換対象の URL を入力し[変換]ボタンを押すと、変換され、テキスト・ファイルを保存するか否かを問い合わせてくる。

サンプル・プログラムの解説:HTTPヘッダ

0053:     header('Content-Disposition: attachment; filename=download.txt');

このプログラムも、入力と変換を 1 つのファイルですませるように工夫してある。
ただし、後半はテキストファイルを出力するため、HTML 形式ではなくなる。そこで、前半部分に HTML を構成する<!DOCTYPE html></html>をすべて入れてある。

組み込み関数  header  が、テキスト・ファイルを出力するための肝である。
header は、サーバが HTML コンテンツを送信する前に付加する HTML レスポンス・メッセージのメッセージ・ヘッダ――HTTP ヘッダ――を出力するための関数である。
"download.txt" という名前のテキスト・ファイルを、サーバからクライアントに向かって送信するには、サンプル・プログラムのように記述する。

サーバから送られてきた拡張子 ".txt" のファイルに対してクライアント側がどのように動くかについては、ブラウザの MIME 設定による。一般的なブラウザでは、ファイルを保存するようなメッセージが出る。

ここで、HTTP ヘッダについて簡単に説明しておこう。
通常の HTML コンテンツの場合、以下のようなメッセージ・ヘッダが返る(サーバは Apache)。

HTTP/1.1 200 OK
Date: Thu, 20 Mar 2003 11:03:45 GMT
Server: Apache
Last-Modified: Mon, 10 Mar 2003 05:58:20 GMT
Connection: close
Content-Type: text/html


これが gif ファイルだと以下のようになる。

HTTP/1.1 200 OK
Date: Thu, 20 Mar 2003 11:03:45 GMT
Server: Apache
Last-Modified: Mon, 10 Mar 2003 05:58:20 GMT
Connection: close
ETag: "833be-ae7-383bb23c"
Accept-Ranges: bytes
Content-Length: 12345
Content-Type: image/gif


テキスト・ファイルを送る場合は、header("Content-Type: text/txt") とするだけでも十分なのだが、そうすると、保存ファイル名が php ソースと同じ名前になってしまう。

サンプル・プログラムの解説:HTMLタグを除く

0061:     while (! feof($infp)) {
0062:         $str = fgetss($infp, 1000);      //HTMLタグを除いた1行読み込み
0063:         $str = mb_convert_encoding($str, INTERNAL_ENCODING, 'auto');
0064:         $str = trim($str);                   //空白文字を除く
0065:         if (strlen($str) > 0)   print $str . "\n";   //0文字以上なら出力する
0066:     }

ファイルを読み込む部分の流れは、以前のプログラムと同じである。違うのは、1行読み込みのための関数として  fgetss  を使っていることだ。
関数  fgetss  は、ファイルから 1行読み込むと同時に、HTML タグや PHP プログラムを除く。戻り値は、タグなどを除いたあとの文字列である。
オプションで一部のタグを残しておくこともできる。table, tr, td タグのみを残しておきたいなら、fgetss($fp_in, 1000, "<table><tr><td>") のように記述する。

次に、入力された文字列を内部エンコード INTERNAL_ENCODE に変換する。この処理は関数  mb_convert_encoding  を使えばよい。
(この項おわり)
header