• ベストアンサー

文字列検索の結果を赤で表示したい

全文検索のフリーソフト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 "; }

  • Perl
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • feininger
  • ベストアンサー率41% (74/180)
回答No.1

下記の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 にメタキャラが含まれていたら頭に \ を付加することで無害化させています。

tonka729
質問者

お礼

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 に関する記述は知識がなくて分かりませんでした。この数行を動かすためには、どのような知識が必要なのでしょうか?済みませんが、引き続き御教示いただけませんでしょうか。

その他の回答 (1)

  • duckling
  • ベストアンサー率47% (88/185)
回答No.2

([\+\*\.\?\^\$\[\-\]\|\(\)\\]) 多分、↑これがなんなのかが分からない故の疑問だと思うのですが、 これは「正規表現」と呼ばれるものです。 参照URLに正規表現の簡単な説明が載っているページを書いておきましたが、 「perl 正規表現」で検索すると、いろんなサイトが見つかります。 正規表現はいろんなところで使用されるので 覚えておいて損はないものだと思いますよ。

参考URL:
http://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
tonka729
質問者

お礼

duckling さま、とても便利なperlの包括的なサイトをご紹介いただきありがとうございました。色の付け方、コード変換、ライブラリ一覧表、などについて記述を探してみます。

関連するQ&A

  • 検索の結果見つかった文字列を赤で表示するには?

    去年の11月コード番号No.699161で一度お尋ねしたのですが、行き詰まったまま今も困っていますので、お願いします。 検索の結果見つかった文字列を赤で表示させたいのです。 $yakugo = 'adj. [次の成句で] \njm. seine Geliebte abspenstig machen 或人の恋人を取る; \neinem Geschaeft die Kunden abspenstig machen 或る店のお客を横取りする'; 上記のような文字列$yakugoをテキストエリアに表示する際に、改行マークでは改行させ、 恋人'という文字列があればそれを赤で表示するようにしたいので、次のような表記表現で置換しました: $yakugo=~ s/\\n/\n/g; $color ="red"; $yakugo =~ s/<[^>]*(>|$)//g; $tmp = '恋人'; $tmp =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g; $yakugo =~ s/($tmp)/<B style="color:red">$1<\/B>/ig; $yakugoを下のテキストエリアに書き込みますと <TEXTAREA style="background-color:#F1E3FF; font-size:18; border:5px double #008040;font-family: 'MS P明朝', serif;" name="DATA" rows="10" cols="50" >$yakugo</TEXTAREA> adj. [次の成句で] jm. seine Geliebte abspenstig machen 或人の<B style="color:red">恋人</B>を取る; einem Geschaeft die Kunden abspenstig machen 或る店のお客を横取りする と表示され、改行はできているのですが、色を付けるタグがそのまま出てしまって、色が付きません。  また次の検索結果を表示させるとすべて文字化けになり: <B style="color:red"></B>+<B style="color:red"></B>[<B style="color:red"></B>a<B [略] のようになってしまいます。 この例では検索文字列が1回しか見つかりませんが、これが複数回の場合でも色が付くようにしたいと思います。どうぞよろしく御教示下さい。

    • ベストアンサー
    • Perl
  • perlで半角カナを検索するには、どうしたらいいのでしょうか?

    perl初心者です。 下記のようなファイルがあったとします。 パナソニック(ナショナル) 三菱電機 日立 東芝 SONY 下記のように、書きました while (<IN>) { use Jcode; Jcode::convert($_, 'euc'); chomp; $line+=1; Jcode::convert($_, 'euc'); if ($_=~ /\x8E/) { print "行=$line $_\n"; } } できあがったファイルは、下記のように、半角カナではなく、字化け状態になってしまいました。 行=2 姉鰭電機 行=4 東芝 よろしくお願い致します。

  • cgiスクリプトの文字化け

    既存のCGIライブラリ(cgi-lib.plとjcode.pl)を用いて、登録フォームを作りました。しかし、「入力」を押して、CGIを作用させると、文字化けがおこってしまいます。 cgiのなかで、文字コードをeucに変換しています。(jcode::convert機能)サーバーのCGI設定は全て確認しましたし、パーミッションも確認しています。文法などはあってると思いますし、ディレクトリ、文字コード(euc)・改行コード(LF)も確認しています。 他に原因があると思うのですが、回答よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • CGIでjcode.plを読み込めなくなりました

    さんざん検索をかけて色々試したのですが、どうしても解決できず どなたかご存知のかた、教えてください。よろしくお願い致します。 つい昨日までちゃんと動いていたCGIが突然 「jcode.plがありません」 と訴えてきました。 4月にサーバーを乗換え丸2ヶ月、問題なく動いていたのに 突然です。何がなんだか分かりません。 もちろん、このCGIに関わるファイルは一切いじっておりません。 自分なりに検討した結果 引っかかっているのは以下のコード # 漢字コード変換ライブラリを読み込む if (-f "jcode.pl") { require "jcode.pl"; } else { &errexit("jcode.plがありません。\n"); } -略- &jcode'convert(*tmp, $kcode_cgi); このふたつです。jcode.plを読み込めない為にもれなく後出の呪文が効かないんだろうなという事は推測しているのですが。 このためフルパスでも試しましたが変化なし。 この読み込みをしなければ、CGIは取りあえず表示します。 なので、日本語変換プログラム以外は正常に動作しているようです。 どなたか同じような経験の有る方いらっしゃいませんか? アドバイスよろしくお願い致します。

    • ベストアンサー
    • CGI
  • Jcode.pmでconvertできない

    あけましておめでとうございます。 早速ですが、皆様のお力を拝借したく。 WindowsXPSP2+ActivePerl5.6.1でJcode.pmを使用して、utf8へ変換しようとしました。 http://okwave.jp/qa2600582.html を参考にJcode.pmを導入し(とある事情でインストールしておりません)、以下のソースを記述しました。 ちなみに"sjis"で記述しております。 #!/usr/local/bin/perl use lib "./lib"; use Jcode; $buf = "てすてすてす"; print "BeforeCode=".Jcode::getcode($buf)."\n"; Jcode::convert( \$buf, "utf8"); #$j = Jcode->new($buf); #$buf = $j->utf8; print "$buf\n"; print "AfterCode=".Jcode::getcode($buf)."\n"; exit; すると BeforeCode=sjis AfterCode=euc と表示され、"utf8"を指定したにも関わらず、"euc"に変換されてしまいました。 次に、上記ソースの中ほどを #Jcode::convert( \$buf, "utf8"); $j = Jcode->new($buf); $buf = $j->utf8; と書き換えてみました。すると、 BeforeCode=sjis Undefined subroutine &Jcode::_Classic::euc_utf8 called at lib/Jcode/_Classic.pm line 255. とエラーが出てしまいます。 見た感じeuc_utf8が存在しないと言われているようですが、Jcode\Unicode\NoXS.pmに存在しています。 環境に問題があるような気はしますが、どのようにすれば"utf8"への変換が成功するのでしょうか?ご教授いただければ幸いです。 ちなみに上記ソースで Jcode::convert( \$buf, "jis"); Jcode::convert( \$buf, "euc"); Jcode::convert( \$buf, "sjis"); はすべて成功し、指定した文字コードに変換されました。 "utf8"への変換だけが失敗するという状況で、新年早々頭を抱えております。

    • ベストアンサー
    • Perl
  • jcodeコンバートさせた後の置換処理が無効になるのはなぜ

    jcodeコンバートさせた後の置換処理が無効になるのはなぜですか? foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); #jcode'convertの後ではNG------------# $value =~ s/://g; $value =~ s/,//g; } foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); #jcode'convertの前ならOK------------# $value =~ s/://g; $value =~ s/,//g; &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); }

    • ベストアンサー
    • Perl
  • 半角カタカナ→全角カタカナ変換がうまくいきません。

    お世話になっております。 フォームから入力された文字を、 「半角カタカナ→全角カタカナ」変換したいのですがうまくいきません。 コーディングは以下の通りですが、問題の箇所がわかりません。 どなたかご教授ください。 なお、jcode.plは、最新のものを使っています。 #↓=============================================== ##### フォームデータ受け取り if ($ENV{'REQUEST_METHOD'} eq 'POST') {  read( STDIN , $buffer , $ENV{'CONTENT_LENGTH'} ); } else {  $buffer = $ENV{'QUERY_STRING'}; } # 文字コードを正確に取得するために,全ての送信データをいったん文字コードチェックする $buffer1 = $buffer; $buffer1 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $kcode = &jcode::getcode(*buffer1); @pairs = split(/&/ , $buffer); ##### フォームデータのデコード、漢字コードをsjisに変換 foreach $pair (@pairs) {  ($k,$v) = split(/=/,$pair);  $v =~ tr/+/ /;  $v =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;  &jcode'convert(*v,"sjis",$kcode);  # 半角カナを全角に変換  if($kcode eq 'sjis') {   &jcode::h2z_sjis(\$v);  }  if($kcode eq 'euc') {   &jcode::h2z_euc(\$v);  }  if($kcode eq 'jis') {   &jcode::h2z_jis(\$v);  }  $in{$k} = $v; } #↑=============================================== (なお、全角スペースは、半角スペースなどに変更願います。) よろしくお願いします。

  • Sendmailの文字化けについて

    以前にも同じ質問をしたのですが、いまいち解決していないので、もう一度質問させて頂きます。 ホームページでsendmailをつかってフォームより記入してもらった内容を自分のところと確認メールとして記入した人のところに送るようにしていますが、確認メールが文字化けすることがあるようです。 しかし、全ての人に対して化けるというわけではなく、ほとんどの場合は大丈夫なようですが、一部の人に対してだけ化けるようです。 関係しそうな部分を大まかに書くと下記のようにしておりますが、間違っているでしょうか? if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } @pairs = split(/&/,$buffer); foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; &jcode'convert(*value,'sjis'); &jcode'convert(*name,'sjis'); $xx =$value; &trans; $value = $xx; } sub trans{ $from='[@01-9A-Za-z._-]'; $to='[@01-9A-Za-z._-]'; &jcode'convert(*xx, 'euc'); &jcode'convert(*from, 'euc'); &jcode'convert(*to, 'euc'); &jcode'tr(*xx, $from, $to); &jcode'convert(*xx, 'sjis'); } &jcode'convert(*message,'jis'); if (!open(MAIL,"|$sendmail $mail_address")) {&error;} &jis("Subject: $mailname"); print MAIL "$msg\n"; print MAIL "To: $mail_address\n"; print MAIL "From: $mailfrom\n"; print MAIL "\n"; print MAIL "$message"; close(MAIL); sub jis { $msg = $_[0]; &jcode'convert(*msg, 'jis');}

    • ベストアンサー
    • Perl
  • ムーバブルタイプ3.2のBerkeleyDB⇒SQLへの移行について

    現在ロリポップでムーバブルタイプ3.2で新規にblogを作りました。 データ形式をはじめはBerkeleyDBで使用していたのですがSQLへ移行を行ないたいと思い以下のものを利用してみたのですが以下のエラーがでます。 http://as-is.net/wiki/MT_Database_Converter/ja mt-db-convert.cgi($Rev: 173 $): Converting your MT data between DB engines (for MT 3.2) **** WARNING: Subroutine Jcode::ucs2_euc redefined at extlib/Jcode/Unicode/NoXS.pm line 56. **** WARNING: Subroutine Jcode::euc_ucs2 redefined at extlib/Jcode/Unicode/NoXS.pm line 71. **** WARNING: Subroutine Jcode::euc_utf8 redefined at extlib/Jcode/Unicode/NoXS.pm line 87. **** WARNING: Subroutine Jcode::utf8_euc redefined at extlib/Jcode/Unicode/NoXS.pm line 94. **** WARNING: Subroutine Jcode::ucs2_utf8 redefined at extlib/Jcode/Unicode/NoXS.pm line 101. **** WARNING: Subroutine Jcode::utf8_ucs2 redefined at extlib/Jcode/Unicode/NoXS.pm line 124. どのような設定をすればSQLに移行できるのでしょうか?

  • Jcode,pmを使った連続変換に失敗してしまう

    フォームから入力された内容について、 全角数字を半角数字へ、半角カナを全角カナへ変換したいので、 Jcode.pmを使ったのですが、たとえば、 「全角数字を半角数字」だけとか、「半角カナを全角カナ」だけ だとうまくできますが、連続して両方変換しようとすると Jcodeのエラー「Not a SCALAR reference at Jcode.pm line 626」がかえってきてしまいます。 このようなコードを書いています。 use Jcode; $AAA = 'あいう012カキクser'; (実際はフォームからのデータ) &Jcode::convert(\$AAA, 'euc'); my $j = Jcode->new(); $j->set($AAA, 'euc'); $BBB = $j->tr('0-9A-Za-z', '0-9A-Za-z'); (数字変換:ここまでは成功する) my $j = Jcode->new(); $j->set($BBB, 'euc'); #1 $CCC = $j->h2z->euc; (カナ変換:失敗してエラーが発生する) コードはEUCで書いています。どうも #1 のところで、 2行上であらかじめJcodeによって変換されたものが格納されている 変数$BBBを指定するとエラーが起きるようです。#1のところで、 $j->set($AAA, 'euc'); #1 $CCC = $j->h2z->euc; とするとエラーは起きないのです。 変換の順番をいれかえても現象は同じでした。 どうすれば両方の変換ができるようになるでしょうか。 どうぞよろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう