- ベストアンサー
文字列検索の結果を赤で表示したい
全文検索のフリーソフトwwwsrch.cgiのソースのたぶん次の箇所が、検索結果を赤で表示している箇所だと思いますが、はて、自分の力ではこれを読みこなせません。 どなたか、もし基本的なかたちだけでも素描していただけないでしょうか。 for ($j = $imin; $j <= $imax; $j++) { $line = $lines[$j]; &jcode'convert(*line, "euc"); $line =~ s/<[^>]*(>|$)//g; $tmp = $word; &jcode'convert(*tmp, "euc"); if ($jflag) { $tmp =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g; } #$line =~ s/($tmp)/<B>$1<\/B>/ig; $line =~ s/($tmp)/<B style="color:red">$1<\/B>/ig; &jcode'convert(*line, $kcode_cgi, "euc"); print "$line "; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
下記の3行に注目します。 1) $line =~ s/<[^>]*(>|$)//g; 2) $tmp =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g; 3) $line =~ s/($tmp)/<B style="color:red">$1<\/B>/ig; 基本的には3だけで色を変更しています。 3は $line に含まれている $tmp という文字を <B ~>$tmp</B> に置き換えています。 (Googleキャッシュでのハイライト表示もたしか<B>タグで色変更してた) ただし、3だけだと2つの問題が発生します。 問題A) タグの中の文字まで置き換えられてしまうと表示が変になる 問題B) $tmpに正規表現で使用される特殊な文字(メタキャラ)が含まれていると動作が変になる 問題Aを解決するために1で $line に含まれているタグをすべて削除しています。 問題Bを解決するために2で $tmp にメタキャラが含まれていたら頭に \ を付加することで無害化させています。
その他の回答 (1)
- duckling
- ベストアンサー率47% (88/185)
([\+\*\.\?\^\$\[\-\]\|\(\)\\]) 多分、↑これがなんなのかが分からない故の疑問だと思うのですが、 これは「正規表現」と呼ばれるものです。 参照URLに正規表現の簡単な説明が載っているページを書いておきましたが、 「perl 正規表現」で検索すると、いろんなサイトが見つかります。 正規表現はいろんなところで使用されるので 覚えておいて損はないものだと思いますよ。
お礼
duckling さま、とても便利なperlの包括的なサイトをご紹介いただきありがとうございました。色の付け方、コード変換、ライブラリ一覧表、などについて記述を探してみます。
お礼
feininger さま、いつも丁寧にお教えいただき、大変助かっております。 私の場合、次のような変数$yakugo (辞書の訳語のことです)をテキストエリアに、検索語$inputword に色を、最初の出現箇所だけでなく、すべて出現する箇所で赤にして表示したいのです。どうやらwwwsrch.cgi がやっているコード変換など、またPerl のライブラリの知識が私に欠けているためらしく、見事に!失敗しました。 $yakugo=~ s/\\n/\n/g; $yakugo =~ s/<[^>]*(>|$)//g; $tmp = $inputword; $tmp =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g; $yakugo =~ s/($tmp)/<B style="color:red">$1<\/B>/ig; 最後のstyle に関する記述は知識がなくて分かりませんでした。この数行を動かすためには、どのような知識が必要なのでしょうか?済みませんが、引き続き御教示いただけませんでしょうか。