HTMLのTABLEタグを簡単にCSVファイルに変換する方法
実装のパターンとして一覧で表示されている表を、CSVファイルでダウンロードできるようにすることがあると思います。
このときHTMLをTABLEタグで表示しているものを、CSVで実装しなおすのは手間がかかりますし、表の並び順が変わったり列が追加されたときにHTMLもCSVも変更しなければいけないのは面倒です。
そこでTABLEタグで表示されているHTMLをCSVに変換すると楽になります。
Smartyを使用している場合はアウトプットフィルターを使うだけで、簡単にHTMLがCSVになります。
Smartyに実装する方法
[参考記事] Excelで保存したときのCSVファイルの仕様
[参考記事] 複雑なExcelファイルをプログラムで作成する方法
実現方法
PHPでは、次のコードで実装し、出力される前に次の関数table_tag2csv()を通します。
コード
/* ================================
* table_tag2csv
*
* @create 2010/04/09
* @author pentan
* @url http://pentan.info/
*
* Copyright (c) 2009 pentan.info All Rights Reserved.
* 著作権表示部分の変更削除は禁止です
* ================================
*/
function table_tag2csv($buff) {
$buff = preg_replace("/>[\s]+</is","><",$buff);
$buff = preg_replace("/^.*<table[^>]*>/Uis","",$buff);
$buff = preg_replace("/<\/table>.*$/is","",$buff);
$buff = preg_replace("/<([a-z]+) ([^>]+)>/i","<$1>",$buff);
$buff = preg_replace("/<th>/i","<td>",$buff);
$buff = preg_replace("/<\/th>/i","</td>",$buff);
$buff = preg_replace("/<\/?[^(tr|td)<>]+>/i","",$buff);
$buff = str_replace("\r\n","\n",$buff);
$buff = preg_replace("/(\r|\n)/","\r\n",$buff);
$csv = "";
if(preg_match_all("/<tr>(.*)<\/tr>/iU",$buff,$trmatches)){
foreach($trmatches[1] as $rows){
if(preg_match_all("/<td>(.*)<\/td>/iU",$rows,$tdmatches)){
for($i=0;$i<count($tdmatches[1]);$i++){
if(strpos($tdmatches[1][$i],",")!==false || strpos($tdmatches[1][$i],'"')!==false || strpos($tdmatches[1][$i],"\r\n")!==false){
$tdmatches[1][$i] = '"'.str_replace('"','""',$tdmatches[1][$i]).'"';
}
$tdmatches[1][$i] = htmlspecialchars_decode($tdmatches[1][$i]);
}
$csv .= implode(',',$tdmatches[1]);
}
$csv .= "\r\n";
}
}
header('Cache-Control: private, max-age=10800, pre-check=10800');
header('Content-Disposition: attachment; filename="'.date("Y-m-d").'.csv"');
header('Pragma: no-cache');
header('Content-Type: text/comma-separated-values');
header('Content-Length: ' . strlen($csv));
return $csv;
}
使い方
実行部
<?php
if(!($fp = @fopen("index.html","r"))) {
die;
}
$data="";
while (!feof($fp)) {
$data.=fgets($fp, 4096);
}
fclose($fp);
$data = table_tag2csv($data);
echo $data;
Smartyに実装する方法
Smartyでは、アウトプットフィルターにこの関数を指定することで、出力がフィルタリングされます。
$smarty->register_outputfilter("table_tag2csv");
関連記事
- PHPでwebサーバー(apache/nginx)の実行ユーザー・グループを確認する方法
- リクエストヘッダーやリクエストボディーなどを取得する方法
- 負荷が高いときには503エラーを返す方法
- サイトの更新情報をPINGサーバに送信する方法
- PHPでロードアベレージを表示させる方法
- PHPでTwitterのツイートをする/ツイート一覧を取得する/検索する(API v1.1)
- インクルードパスを設定する方法
- オブジェクト(Object)を配列(Array)に変換する方法
- PHPでgzip圧縮形式(gz圧縮)のファイルを読み書きする方法
- PHPでfacebook投稿時に公開範囲を指定する方法
- PHPで複数の画像をfacebookに投稿する方法
- PHPでfacebookのフィード(ウォール)に投稿する方法
- PHPでのfacebookアプリの認証処理(APIを使うユーザー認証)
- MySQL関数のまとめ
- MySQLサーバに接続できるかどうかを確認する
- ディレクトリ内のファイルのパーミッションを一括で変更する
- POSTでアップロードできるファイルサイズの制限を変更する方法
- 暗号化・複合化を行う ブロック暗号
- date型やdatetime型と年月日時分秒への変換
- 関数・メソッドの存在を調べる方法
- PHPでTwitterのbotを作る方法 ツイートをする/ツイート一覧を取得する(API v1)
- strtotimeの指定
- PHPでHTMLメールを送る方法
- ディレクトリセパレータを短く定義する DIRECTORY_SEPARATOR
- モザイク画像を作る方法
- HTML内のアクセス解析タグを除去する方法
- 画像表示のときに指定サイズにリサイズする(画像の拡大縮小)
- テキストを可逆的な暗号化する Crypt_Blowfish
- PHPでwhois検索をする Net_Whois
- よく使うヘッダー関数のまとめ
- キャリア・世代を判別する
- mb_send_mailでCCやBCCを指定する 表示名を指定する
- より高速に、推測困難な一意なIDを生成する方法
- 画像ファイルを指定容量ぎりぎりに圧縮する
- 指定したHTTPヘッダーが送信済みあるいは送信予定に含まれているか
- DOCUMENT ROOTを得る $_SERVER["DOCUMENT_ROOT"]は使えない!
- マルチバイト文字列(日本語文字)を一文字づつ取り出す
- ファイルを削除する/フォルダを削除する
- ファイルを読み込む/ファイルに書き込む
- ディレクトリ内のファイル一覧を取得する
- quoted-printable文字列の変換
スポンサーリンク





