ネタバレや腐臭発言が混じるらくがきメモ

2008年11月21日(金) 日記内検索日記

こんなの毎日書くなら休止してた方がいいような気がする日記。

検索です検索。マルチバイト文字の2バイト目と次の字の1バイト目が組み合わさって誤検出みたいになるあれ。「せ」(\xA4\xBB)で検索すると「気持ち」(\xB5\xA4\xBB\xFD\xA4\xC1)がひっかかってしまう問題。
あれってなんか本文も検索ワードも1文字(2バイト)ずつ区切った上で検索し、しかるのち元に戻す…みたいなことをしなればならないらしいですね。びっくりした。すごいなー! つまり検索エンジンとかはそういうことをしてると…! あの膨大なページの内容を1文字1文字区切ってると! うわー。それともそれはEUCだけなのかしら。でもはてなダイアリーとかEUCですよね。つまりはてな検索はきっと全ダイアリーを区切っている…一文字ずつ! すごいなー!

けどここの日記内検索でそれ実際やってみたら重くなったのでやめた。まあ1文字で検索しなければほぼないことだし、使うの自分だからいいよ(それ言ったら終わる)
でもハイライトをつけた時に文字化けするのはあれなので、ハイライトonの時だけそれにした。にしてもハイライトって面倒なものだったんだなあ。文字化けもそうだけど、全角アルファベットの大文字小文字が検索ワードと違う時にどうやってハイライトのタグを付けるのかという心からどうでもいいけど片づかないと気になってしまう問題に悩んだ今日でした。
結局本文の英数字を半角に変換して、変換する時にマークをつけておいて、検索してハイライトのタグをつけ、そしてマークのとこだけ全角に戻す、てやったけどこれ絶対間違ってるよね。こんな無駄なことをみんながしているわけがないもの。日記内検索のハイライトを担当する部分だけで、こんな長さに
sub NickySerchLight{
my($zha,$zhb,$zhc,$zhd,$hi);
($SWord[$_],$cword) = @_ ;

$zha = qr{(?<!\x8F)};
$zhb = qr{(?=(?:[\xA1-\xFE][\xA1-\xFE])*(?:[\x00-\x7F\x8E\x8F]|\z))}x;
$zhc ="<<z_h>>";
$zhd ="<<\/z_h>>";
$Message =~ s/$zha\xA3([\xB0-\xB9\xC1-\xDA\xE1-\xFA])$zhb/$zhc.pack("C", ord($1) - 0x80).$zhd/oeg;
$Message =~ s/$zhd$zhc//g;
$Title =~ s/$zha\xA3([\xB0-\xB9\xC1-\xDA\xE1-\xFA])$zhb/$zhc.pack("C", ord($1) - 0x80).$zhd/oeg;
$Title =~ s/$zhd$zhc//g;
$Title =~ s/([\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])/$1\n/g;
$Message =~ s/([\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])/$1\n/g;

for($hi = 0; $hi<$cword; $hi++){
$SWord[$hi] =~ s/([\x8E\xA1-\xFE][\xA1-\xFE])/$1\n/g;
$Message =~ s/($SWord[$hi])/<span class=\"hili\">$1<\/span>/ig;
$Title =~ s/($SWord[$hi])/<span class=\"hili\">$1<\/span>/ig;
1 while $Title =~ s/(<[^>]*)(<span class=\"hili\">)([^<]*)(<\/span>)/$1$3/ig;
1 while $Message =~ s/(<[^>]*)(<span class=\"hili\">)([^<]*)(<\/span>)/$1$3/ig;
$SWord[$hi] =~ s/\n//g;
}
$Message =~ s/$zhc<span class=\"hili\">/<span class=\"hili\">$zhc/g;
$Message =~ s/<\/span>$zhd/$zhd<\/span>/g;
1 while $Message =~ s/($zhc[0-9A-Za-z])([^$zhd])/$1$zhd$zhc$2/g;
$Message =~ s/$zhc([0-9A-Za-z])$zhd/pack("C*", 0xA3, ord($1) + 0x80)/eg;
$Title =~ s/$zhc<span class=\"hili\">/<span class=\"hili\">$zhc/g;
$Title =~ s/<\/span>$zhd/$zhd<\/span>/g;
1 while $Title =~ s/($zhc[0-9A-Za-z])([^$zhd])/$1$zhd$zhc$2/g;
$Title =~ s/$zhc([0-9A-Za-z])$zhd/pack("C*", 0xA3, ord($1) + 0x80)/eg;
$Title =~ s/\n//g;
$Message =~ s/\n//g;
}

ありえないよ。無知は悲劇、みたいなのを地でいくようなことをしてるんでしょうね
月別ログ
日記内検索機能

RSS

PaintBBS / spainter Shi-dow
Diary CGI  Nicky! + rssnicky