実験室

青空文庫
用例検索デモ

1.フォルダ内のテキストファイルを全部読み込んで一覧表示する。

 まづ、フォルダ内のテキストファイルをglob()を使ってパス名を拾ひあげ、順にファイルを開いてファイル名、長さ、作品名と著者の一覧表を表示させます。前の英語版と同じです。

<ol>
<?php
foreach (glob("*.txt") as $filename) {
	$fd = fopen ($filename, "r");
	$title = fgets ($fd, 100);
	$name = str_pad($filename,14,_,str_pad_left);
	$name = str_replace("_", "&nbsp;", $name);
	$title = str_replace("目次", "", $title);
	echo "<li> $name (size:" .filesize($filename). ") Title/Author: " .$title. "</li>\n";
	fclose ($fd);
	}
?>
</ol>

 『大正の文豪』のテキストファイルには、第一行目に作品名と著者名と「目次」といふ語が並んでゐるので、「目次」を除いて、これを表示させます。

2.フォルダ内のテキストファイルを全部読み込んで検索し、kwic表示する。

 さて、送られてきた検索語を受けて、それを$keyと名付けます。glob()を使って全ファイルのパス名を拾ひあげ、ファイルを開いて、さきほどと同様に作品名を取得します。中身を抜きだし、ここから検索語のある場所を拾ひあげます。最初に、改行コードを空白一個に置換しておきます。後で置き換へようとすると、うまくいきません。全文の改行コードを書き換へるのですから、ずいぶんな作業だと思ひますが、まあいいでせう。mb_strposを繰りかへし、検索語を拾ひあげます。日本語なのでマルチバイト用のstrpos を使ひます。位置を拾ひあげたら、mb_strimwidthで範囲を指定して表示させませう。下に示したのはEUCで検索語の前20文字目から48文字分を抜き出したときの例。UTF-8の場合は、($contents, $result-20, 96)と書かないと同じ結果になりません。なぜ($contents, $result-20, 48)ではないのか。わかりません。

<ol>
<?php

$key = $_POST['word'];

foreach (glob("*.txt") as $filename) {

$fd = fopen ($filename, "r");
$title = fgets ($fd, 100);
$title = substr ($title, 0, 12);
$contents = fread ($fd, 1024*1024);
$contents = str_replace("\n", " ", $contents);
fclose ($fd);
$offset = 0;
$result = 0;

do {
       $result = mb_strpos ($contents, $key, $offset);

       if ($result === FALSE) {
           break;
       } else {
       
	   echo "<li><a href='", $filename, "' target='_blank'>", \
	   	$title, "</a>|";
	   echo "<a href='show.php?position=", $result, "&key=", $key, \
	   	"&filename=", $filename, "' target='_blank'>";
           echo "#</a>|"; 
	   $sentence=mb_strimwidth($contents, $result-40, 96);
	   $sentence = str_replace("…", "・", $sentence);
	   $sentence = str_replace("―", "ー", $sentence);
	   $sentence_f=stristr($sentence, $key);
	   $sentence=str_replace($key, "<em>".$key."</em>", $sentence);
	   echo $sentence, "</li>";   
       $offset = $result + 1;  
       }
       
}  while ($result == TRUE) ;

}

?>
</ol>

 「ー」や「…」を置換してゐるのは、位置を揃へるため。とにかく、私の画面ではかうしないと、揃はなかったのですよ。
 つぎに、検索語が見つかったところから、前後数行を表示させる画面を作ります。

<?php
$pos = $_GET['position'];
$filename = $_GET['filename'];
$key = $_GET['key'];

$fd = fopen ($filename, "r");
$title = fgets ($fd, 100);
$title = str_replace("目次", "", $title);
$contents = fread ($fd, 1024*1024);
$contents = str_replace("\n", "@", $contents);
fclose ($fd);
	
echo "<h2>" .$title. "</h2>";
$sentence=mb_strimwidth($contents, $pos-300, 620);
$sentence=str_replace("@", "<br />", $sentence);
$sentence=str_replace($key, "<em>".$key."</em>", $sentence);
echo $sentence;   
	
?>

 改行コードを全角文字一個に換へて、後でまたhtmlの改行タグに換へるのは、先に換へてしまふと上の数へ方と結果が合はなくなってしまふからです。kwic表示のときは改行はない方がよい訳ですが、該当部分を表示させるページでは改行はあった方がいいでせう。実際に動かしてみるデモ画面を作っておきました。ここで、『大正の文豪』を使ふ訳にはいかないので、青空文庫から、夏目漱石と泉鏡花の作品をダウンロードさせてもらひ検索できるやうにしました。
 これくらゐなら速さに問題はありませんが、『大正の文豪』全体となるとやや遅く感じます。どれくらゐまで増やせるのでせうか。もっと速いパソコンを買はうかな。(2005年2月12日)