今回はHTMLページとPHPページのコードを簡単に説明します。
●ページ構成
今回作成するアプリは、テキストを入力するページ(HTML)とそのテキストを加工処理するページ(PHP)の2段構成となっています。
簡単に説明すると、入力ページではフォームのテキストボックスを使っています。SUBMITボタン(変換ボタン)を押すと、テキストボックスの内容がPHPページへPOSTされます。
と同時にPHPページが開き、POSTされたテキスト(変換前のオリジナルテキスト)をセッション変数”$_POST”で受け取ります。このテキストをPHPプログラムで加工してHTMLで出力します。
●テキスト入力のページ(get.html)
入力ページのコードを次に示します。ファイル名は”get.html”とします。また、PHPページのファイル名は”get1.php”とします。両ファイルは同一フォルダにあるものとします。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=s-jis" /> </head> <body> <form action="get1.php" method="post"> ソース<br /> <textarea name="source" cols="100" rows="20"></textarea><br /> <br /> <input type="submit" value="変換" /> </form> </body> </html>
6行目までは一般的なhtmlページのコードです。
7~12行目がフォーム部分です。action=”get1.php”で、submitされたとき(変換ボタンがクリックされたとき)にジャンプするページのファイル名を指定しています。
テキストボックス(textarea)は”source”という名前にしています。この名前はpostされたときのテキストボックスの識別名(セッション変数の配列インデックス)となります。
●変換、出力ページ(get1.php)
phpページのコードを次に示します。オリジナルテキストからファイル情報のある行を抽出し、データを抽出する処理は、CSVリスト出力、テーブル出力ともほぼ同じですが、処理を分離してわかりやすくするために、それぞれforeachのブロックにしています。
<?php print("<body>\n"); $ary = preg_split("/[\n]/", $_POST["source"]); // 配列に展開 // print_r($ary); // for debug $outary = array(); // 空の配列を用意 // 空行を削除 foreach ($ary as $str){ if( preg_match("/[^\s]/", $str) ) { // 空行でないとき array_push($outary, $str); // 配列に蓄積 } } // print_r($outary); // for debug $csvAry = array(); // 空の配列を用意 // ************* CSVリスト出力 ********************* // 蓄積したテキストより録画日時を頼りに録画情報抽出 $ix = 0; foreach($outary as $str) { if( preg_match("/20[0-9]{2}\/[0-9]{2}\/[0-9]{2}/", $str) ) { $title = trim($outary[$ix-2]); // タイトル $dulation = trim($outary[$ix-1]); // 再生時間 $date = trim($str); // 録画日時 $size = trim($outary[$ix+1]); // サイズ // $title = str_replace(" ", "+", $title); // スペースを半角に変換 $title = preg_replace("/ +/", " ", $title); // スペースを半角に変換 /* print $title . "<br>"; // タイトル print $dulation. "<br>"; // 再生時間 print $date . "<br>"; // 録画日時 print $size . "<br><br>"; // サイズ */ // $csv = $title . "," . $dulation . "," . $date . "," . $size; // カンマ区切り $csv = $title . "\t" . $dulation . "\t" . $date . "\t" . $size; // tab区切り array_push($csvAry, $csv); } $ix++; } // タブリスト print "<p>TAB区切り(エディタ貼り付け用)</p>\n"; print "<pre>\n"; foreach($csvAry as $str) { print $str."\n"; } print "</pre>\n"; // **************** テーブル出力 ********************** print "<p>表(表計算ソフト貼り付け用)</p>\n"; print "<table border='1' cellpadding='2'>\n"; print "<tr><td>タイトル</td> <td>再生時間</td> <td>日付</td> <td>サイズ</td></tr>\n"; $ix = 0; foreach($outary as $str) { if( preg_match("/20[0-9]{2}\/[0-9]{2}\/[0-9]{2}/", $str) ) { $title = trim($outary[$ix-2]); // タイトル $dulation = trim($outary[$ix-1]); // 再生時間 $date = trim($str); // 録画日時 $size = trim($outary[$ix+1]); // サイズ $title = preg_replace("/ +/", " ", $title); // スペースを半角に変換 print "<tr>"; print "<td>" . $title . "</td>"; print "<td>" . $dulation . "</td>"; print "<td>" . $date . "</td>"; print "<td>" . $size . "</td>"; print "</tr>\n"; } $ix++; } print "</table>\n"; print "</body>\n"; /*入力テキストのフォーマット例 生徒会の一存 Lv.2 #2 0:30:23 2013/10/02 22:29:50 1.9GB */ ?>
簡単に処理を説明します。
4行目で入力ページでpostされたオリジナルテキスト(セッション変数 $_POST["source"]に格納)を配列”ary”に展開します。ここで、オリジナルテキストの各行が、配列の1要素ずつに展開された状態になります。
11行目で空白でない行を取り出して別の配列”$outary”へ順に格納します。この処理を10行目から14行目のforeachですべての行で繰り返します。この繰り返しが完了すると、”$outary”には空白行が削除された中間テキストが残ります。
24行目で中間テキストの中から日付(“20xx/xx/xx”)が含まれる行を探します。この行を見つけたら、その行から相対的に前後する行から、タイトル、再生時間、サイズを抽出し、それぞれ固有の変数へ格納します(26~29行目)。このとき、同時に文字列の前後にある空白文字をtrim()で削除しておきます。
42行目で、抽出した個別のファイル情報(タイトルなど)をタブ区切り形式の文字列に合成します。これが1レコードとなります。なお、カンマ区切りにしたい場合は、41行目を使ってください。ダブルクォーテーションが必要な場合はここで付けます。このへんは用途に応じて適当に変えられます。
このレコードは”$csvAry”配列に順番に追加していき、いったんすべてのレコードをここに蓄積させます。最後に51行目からの$csvAryの内容を1行ずつHTMLで出力します。
57行目からはテーブル出力ですが、オリジナルテキストからファイル情報(タイトルなど)を抽出する部分まではCSVリスト生成時と全く同じ処理です。そのあとは、個別のファイル情報をHTMLのテーブル形式に整形してHTMLで出力するだけです。
注意:
新RECBOXと旧RECBOXとではフォーマットが異なります。ここで作ったプログラムは新RECBOX用です。旧RECBOXは別記事で後日アップします。
●発展
MySqlでデータベースを用意し、各レコードのファイル情報の出力部分をHTML出力ではなく、直接テーブルに書き込む処理も考えられます。
また、レコードをテキストファイルに保存して、ダウンロードする方法もあります。
(一応完)