• ベストアンサー

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

去年の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回しか見つかりませんが、これが複数回の場合でも色が付くようにしたいと思います。どうぞよろしく御教示下さい。

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

  • ベストアンサー
  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.1

問題を切り分けましょう。 タグがそのまま表示されるのは、TEXTAREAを使用しているせいです。 代替案として、DIVを使用する方法があります。(改行を<BR>とする必要があります。) 百聞は一見にしかず。 以下のタグをHTML文書に貼り付けてみてください。 ------------------------------------------------- <TEXTAREA style="background-color:#F1E3FF; font-size:18; border:5px double #008040;font-family: 'MS P明朝', serif;" name="DATA" rows="10" cols="50" >adj. [次の成句で] jm. seine Geliebte abspenstig machen 或人の<B style="color:red">恋人</B>を取る; einem Geschaeft die Kunden abspenstig machen 或る店のお客を横取りする</TEXTAREA> <DIV style="background-color:#F1E3FF; font-size:18; border:5px double #008040;font-family: 'MS P明朝', serif; width:375px; height:200px; overflow:auto;" name="DATA">adj. [次の成句で] <BR> jm. seine Geliebte abspenstig machen 或人の<B style="color:red">恋人</B>を取る; <BR> einem Geschaeft die Kunden abspenstig machen 或る店のお客を横取りする</DIV> ------------------------------------------------- 文字化けの件は状況がよく分かりません。 「次の検索結果を表示」させるためのロジックはどうなっているのでしょうか。 特に、変数 $yakugo の初期化が気になるところです。 $yakugoの値に注目して見直してみてください。

tonka729
質問者

お礼

ありがとうございました。<DIV>...</DIV>で試して成功しました。ただし、やはり、次の$yakugoからは日本語がすべて文字化けします。ご注意を頂いた$yakugo の初期化の点ですが、単語検索のヒットデータはまずすべてファイルに書き込んでおいて、表示にはこのファイルを開いては一行ずつ読んで$yakugoに代入して表示、とやっています。ファイルのなかを調べましたが、検索結果がきれいに並んでいます。日本語文字化けを起こす原因は、やはりタグを取り除いてしまうという置換方法にあるのでしょうか?

その他の回答 (2)

回答No.3

文字化けの件についてですが、 詳細がわからないとコメントできないと思います。 実際にどのようなソースになっているのでしょう? いずれにせよ、 no.1の方がおっしゃられていますとおり、 問題の切り分けをしていくべきです。 >日本語文字化けを起こす原因は、 >やはりタグを取り除いてしまうという置換方法にあるのでしょうか? そのタグ除去部分のコードをのぞいて実行してみてください。 それで、その部分に原因があったのかがわかるはずです。 その他、 'adj. [次の成句で] 中略 お客を横取りする' というような長い(複雑な?)データ以外にでも、 文字化けが発生するのか等調べてみるべきでしょう。

  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.2

$yakugoは問題なさそうですね。 念のため$yakugo以外の変数も一度見直してください。 下記の単純なスクリプトで試してみましたが、文字化けは再現しませんでした。 # sample.pl @yakugo = ( '[シモンズ]恋人もいないのに\n[ベッツィ&クリス]白い色は恋人の色', '[五輪真弓]恋人よ\n[柏原芳恵]恋人たちのキャフェテラス', '[中村雅俊]<i>恋人</i>も濡れる街角\n[松任谷由実]恋人が<u>サンタクロース</u>', '[アリス]<font size=1>走っておいで恋人よ</font>\n[桑田佳祐]<b>白い</b>恋人達\n[うしろ髪ひかれ隊]メビウスの恋人' ); foreach(@yakugo) { $yakugo = $_; # $yakugo初期化 $yakugo=~ s/\\n/\n/g; $yakugo =~ s/<[^>]*(>|$)//g; $tmp = '恋人'; # $tmp初期化 $tmp =~ s/([\+\*\.\?\^\$\[\-\]\|\(\)\\])/\\$1/g; $yakugo =~ s/($tmp)/<B style="color:red">$1<\/B>/ig; print $yakugo,"\n"; } # end of sample.pl

tonka729
質問者

お礼

ありがとうございました。ご返事が送れて済ません。先ほどやっと成功しました。  文字化けの原因が分かりました。それは、$tmp の初期化がうまくいっていなかったためでした。ほかの箇所に原因があったのにここにばかり目を向けすぎていて、お恥ずかしい次第です。それにもかかわらず,親切にご指示を頂きありがとうございました。 これでさらに先へ進むことができます。  

関連するQ&A