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

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

(2021 年 2 月 6 日)PHP8 対応

目次

サンプル・プログラム

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

解説:HTTPヘッダ

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

このプログラムも、入力と変換を 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タグを除く

0084:     while (! feof($infp)) {
0085:         $str = fgets($infp, 1000);       //最大1000バイトを読み込む
0086:         $str = strip_tags($str);     //HTML および PHP タグを取り除く
0087:         $str = mb_convert_encoding($strINTERNAL_ENCODING, 'auto');
0088:         $str = trim($str);                   //空白文字を除く
0089:         if (strlen($str) > 0)   print $str . "\n";   //0文字以上なら出力する
0090:     }

ファイルを読み込む部分の流れは、以前のプログラムと同じである。
HTML や PHP タグを取り除いて 1行を読み込むのに、 fgetss  を使っていたが、この関数は PHP7.3 から非推奨になったため、 fgets  と  strip_tags  関数に置き換えた。
 strip_tags  関数は、オプションで一部のタグを残しておくこともできる。table, tr, td タグのみを残しておきたいなら、strip_tags($str, "<table><tr><td>") のように記述する。

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