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

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

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

目次

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

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

サンプル・プログラム

圧縮ファイルの内容
html2txt.phpサンプル・プログラム本体
html2txt.php 更新履歴
バージョン 更新日 内容
1.4.0 2023/04/30 OUTPUT_ENCODINGを導入
1.3 2021/02/06 PHP8対応
1.2 2017/03/20 PHP7対応,bug-fix
1.1 2014/07/20 HTML5対応, 大幅改訂
1.0 2005/01/11 初版

解説:HTTPヘッダ

  82:     //出力用HTTPヘッダ
  83:     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タグを除く

  93:     //HTMLコンテンツを1行ずつ読んで処理する.
  94:     while (! feof($infp)) {
  95:         //最大MAX_LINEバイトを読み込む.
  96:         $str = fgets($infp, MAX_LINE);
  97:         //HTML および PHP タグを取り除く.
  98:         $str = strip_tags($str);
  99:         //文字コードをOUTPUT_ENCODINGに自動変換する.
 100:         $str = mb_convert_encoding($str, OUTPUT_ENCODING, 'auto');
 101:         //行頭・行末の空白文字を除く.
 102:         $str = trim($str);
 103:         //0文字以上なら出力する.
 104:         if (strlen($str> 0)   print $str . "\n";
 105:     }

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

次に、入力された文字列を定数 OUTPUT_ENCODE に変換する。この処理は関数  mb_convert_encoding  を使えばよい。
(この項おわり)
header