PHPとKAKASIを使って単語に分解する(その2)

(1/1)
KAKASI を使って漢字かなまじり文を平仮名やローマ時に変換するプログラムの続きである。今回は、テキストだけでなく、ファイルや URL を指定して分解できるように機能を拡張した。

サンプル・プログラム

プログラムを実行する

ダウンロード(PHP4/5共用)

サンプル・プログラムの解説

0069: // メニュー ================================================================
0070: if (isset($_POST["menu"]) == FALSE && isset($_POST["exec"]) == FALSE) {
0071: echo <<< EOF
0072: <h1>■単語に分解・その2 − メニュー</h1>
0073: <form method="post" action="$myself">
0074: <input type="radio" name="menu" value="1" /> テキスト<br />
0075: <input type="radio" name="menu" value="2" checked /> ファイル<br />
0076: <input type="radio" name="menu" value="3" /> URL<br />
0077: <input type="submit" name="submit" value="次へ" /> 
0078: <input type="submit" name="init" value="メニューに戻る" />
0079: </form>
0080: 
0081: EOF;
0082: // データ入力(1)テキスト入力 ===========================================
0083: else if ($_POST["menu"] == "1") {
0084: echo <<< EOF
0085: <h1>■単語に分解 − テキスト入力</h1>
0086: <form method="post" action="$myself">
0087: 分解する文章<br />
0088: <textarea name="text" rows="10" cols="80"></textarea><br />
0089: <input type="submit" name="exec" value="分解実行" /> 
0090: <input type="submit" name="init" value="メニューに戻る" />
0091: </form>
0092: 
0093: EOF;
0094: // データ入力(2)ファイル名入力 =========================================
0095: else if ($_POST["menu"] == "2") {
0096: echo <<< EOF
0097: <h1>■単語に分解 − ファイル名入力</h1>
0098: <form enctype="multipart/form-data" method="post" action="$myself">
0099: ファイル:
0100: <input name="upload" type="file" size="100" />
0101: <input type="submit" name="exec" value="分解実行" /> 
0102: <input type="submit" name="init" value="メニューに戻る" />
0103: </form>
0104: 
0105: EOF;
0106: // データ入力(3)URL入力 ===============================================
0107: else if ($_POST["menu"] == "3") {
0108: echo <<< EOF
0109: <h1>■単語に分解 − URL入力</h1>
0110: <form method="post" action="$myself">
0111: URL:
0112: <input name="url" type="text" size="100" />
0113: <input type="submit" name="exec" value="分解実行" /> 
0114: <input type="submit" name="init" value="メニューに戻る" />
0115: </form>
0116: 
0117: EOF;
0118: // データ処理と出力 ======================================================
0119: else if (isset($_POST["exec"])) {
0120: $keywords = array();         //配列を用意しておく
0121: 
0122: //分解するコンテンツ
0123: if (isset($_FILES["upload"]["tmp_name"])) {
0124:     $contents = file_get_contents($_FILES["upload"]["tmp_name"]);    //ファイルを一気に読み込む
0125:     $contents = mb_convert_encoding($contents, "SJIS", "auto");
0126:     $contents = strip_tags($contents);       //タグを消去しておく
0127:     if ($contents == FALSE) {
0128:         error_exit("ファイル " . $_FILES["upload"]["tmp_name"] . " は存在しません", 1);
0129:     }
0130: else if (isset($_POST["text"])) {
0131:     $contents = $_POST["text"];
0132:     if ($contents == "") {
0133:         error_exit("入力コンテンツがありません", 1);
0134:     }
0135: else if (isset($_POST["url"])) {
0136:     $contents = file_get_contents($_POST["url"]);    //URLを一気に読み込む
0137:     $contents = strip_tags($contents);       //タグを消去しておく
0138:     if ($contents == FALSE) {
0139:         error_exit("URL " . $_POST["url"] . " は存在しません", 1);
0140:     }
0141: else {
0142:     error_exit("コンテンツが存在しません", 1);
0143: }
0144: 
0145: //1行ずつ取り出して単語に分解する
0146: $str = strtok($contents, "\n");
0147: while ($str != FALSE) {
0148:     parsing($Kakasi$str$keywords);
0149:     $str = strtok("\n");
0150: }
0151: 
0152: arsort($keywords);   //出現回数の多い順に並び替え
0153: 
0154: echo <<< EOF
0155: <h1>■分解した単語</h1>
0156: <table border="1">
0157: <tr><th>出現回数</th><th>単語</th></tr>
0158: 
0159: EOF;
0160: foreach ($keywords as $key=>$val) {
0161:     printf("<tr><td align=\"right\">%d</td><td>%s</td></tr>\n", $val$key);
0162: }
0163: echo <<< EOF
0164: </table>
0165: <form method="post" action="$myself">
0166: <input type="submit" name="init" value="メニューに戻る" />
0167: </form>
0168: 
0169: EOF;
0170: // 異常終了 =============================================================
0171: else {
0172:     error_exit("プログラムに渡す値が異常です", 1);
0173: }
0174: 
0175: echo <<< EOF
0176: </body>
0177: </html>
0178: 
0179: EOF;

前回との大きな違いは、メニュー画面を用意し、データをテキスト、ファイル名、URL の 3 つから選択できるようにしたことである。画面の構成は以下のようになっている。
  1. メニュー部
  2. データ入力部
    1. テキスト入力
    2. ファイル名入力
    3. URL 入力
  3. データ処理および出力部
  4. 異常終了部
データ入力部の分岐番号 1~3 は、POST 変数 menu に登録してある。また、exec または init でメインメニューに戻るようにしてある。
space
PHP では内部エラー処理を標準出力(画面)に伝える働きを備えているが、これはセキュリティ上好ましくないことがある
ユーザーからデータを入力させ何らかの処理を行う場合、アタッカーは意図的に不正なデータを入力し、処理の異常終了を誘う。この際、異常な出力やエラーメッセージを手がかりに、プログラムの動きを推測するのだ。
そこで今回は、プログラムの冒頭で関数  error_reporting  を使い、エラーメッセージを一切出力しないようにした。

参考サイト

(この項おわり)
header