• ベストアンサー

複数文字列をハイライト表示

お世話になっております。 textという変数に多くの文字列が格納されており、これを表示させる際、別ファイルであるkey.txtに登録されている単語を特定文字をハイライト表示させたいと考えています。 key.txtには、ハイライト表示させたい単語が以下のように1行ずつ登録されている。 宜しく 寒い 天気 暖かい $text = "こんばんは。はじめまして。宜しく。ここ最近随分と暖かい気がします。"; と、これを表示させる際、別ファイルであるkey.txtを参照し、該当すr単語があった場合は、その単語をハイライト表示させたい。 そこで、現在以下のようなスクリプトを組んでみましたが、key.txtの最後の単語である、「暖かい」のみしかハイライト表示いたしません。 $file_name = "./key.txt"; if(file_exists($file_name)){ $f_data = file($file_name); $f_cnt= count($f_data); for($h=0; $h<$f_cnt; $h++){ $check_key = preg_replace("/\n|\r/", "", trim($f_data[$h])); $string = str_ireplace( $check_key, "<span style=\"background:#ffff66; color:black; font-weight:bold\">".$check_key."</span>", $text); } } echo $string; 最後の「暖かい」しかハイライト表示されないのは、恐らく上書きされるから最後の単語のみハイライト表示になるのでしょうが、上書きされないよう何度も見直しているのですが、どれも解決までに至りません。お恥ずかしい・・。 以上、お忙しい中恐縮ですが、アドバイスのほど頂戴出来れば幸いです。よろしくお願い申し上げます。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> $string = str_ireplace( $check_key, "<span style=\"background:#ffff66; color:black; font-weight:bold\">".$check_key."</span>", $text); ここが毎回、その前に変換した$stringを破棄して、元の$textからの置換をするようになっています。 そのため、最後に行った置換だけが$stringに入ります。 ここを、前に置換したものに対して次の置換を行うようにしないとです。 forの前に $string=$text; として、$string = str_ireplace( 略, $string);とするとか $textが変ってしまってもよいのなら $text = str_ireplace(以下略 とするとかです。

a4_chapp
質問者

お礼

kmeeさま こんばんは。早速のアドバイスをありがとうございます。 >forの前に $string=$text; まったく仰る通りですね。詳しい説明までして頂き恐縮いたします。 ご丁寧なアドバイスをありがとうございました!

その他の回答 (2)

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.3

#2です。 ついでなので、もう一つ 別の書き方をしてみました。 <? $text = "こんばんは。はじめまして。宜しく。ここ最近随分と暖かい気がします。"; $file_name = "./key.txt"; if(file_exists($file_name)){ $f_data = file($file_name); $check_keys = array(); foreach($f_data as $i => $dat) { $dat = trim($dat); $check_keys[$dat] = "<span style=\"background:#ffff66; color:black; font-weight:bold\">".$dat."</span>"; } $string = strtr($text , $check_keys); } echo $string; ?>

a4_chapp
質問者

お礼

bm_hiro様 こんばんは。早速のアドバイスをありがとう御座います。 しかも2つももソースを提示して頂き恐縮です。 for文よりforeachの方が良いとよく耳にします。勉強になります。 有難うございました。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

状況としては#1さんの言っている通りです。 俺なら こう書くかな~ってだけですので、聞き流しでお願いします。 <? $text = "こんばんは。はじめまして。宜しく。ここ最近随分と暖かい気がします。"; $file_name = "./key.txt"; if(file_exists($file_name)){ $f_data = file($file_name); foreach($f_data as $i => $dat) { $check_key = trim($dat); $text = str_ireplace( $check_key, "<span style=\"background:#ffff66; color:black; font-weight:bold\">".$check_key."</span>", $text); } } echo $text; ?>

関連するQ&A