- ベストアンサー
複数文字列をハイライト表示
お世話になっております。 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; 最後の「暖かい」しかハイライト表示されないのは、恐らく上書きされるから最後の単語のみハイライト表示になるのでしょうが、上書きされないよう何度も見直しているのですが、どれも解決までに至りません。お恥ずかしい・・。 以上、お忙しい中恐縮ですが、アドバイスのほど頂戴出来れば幸いです。よろしくお願い申し上げます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> $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(以下略 とするとかです。
その他の回答 (2)
- bm_hiro
- ベストアンサー率51% (200/388)
#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; ?>
お礼
bm_hiro様 こんばんは。早速のアドバイスをありがとう御座います。 しかも2つももソースを提示して頂き恐縮です。 for文よりforeachの方が良いとよく耳にします。勉強になります。 有難うございました。
- bm_hiro
- ベストアンサー率51% (200/388)
状況としては#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; ?>
お礼
kmeeさま こんばんは。早速のアドバイスをありがとうございます。 >forの前に $string=$text; まったく仰る通りですね。詳しい説明までして頂き恐縮いたします。 ご丁寧なアドバイスをありがとうございました!