XAMPP-PHPを使ったRECBOXのファイルリスト作成補助ツール(2)

今回は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出力ではなく、直接テーブルに書き込む処理も考えられます。

また、レコードをテキストファイルに保存して、ダウンロードする方法もあります。

(一応完)

コメントは受け付けていません。