• ベストアンサー

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

お世話になっております。 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

  • 文字列から指定文字を削除

    こんばんは。お世話になっております。 先日、http://oshiete1.goo.ne.jp/qa4940684.html こちらにて別ファイルにある文字列を変数に代入することをお教えいただきました。(今回の件とは直接的に関係ないと思うのですが・・) 今回再度質問させて頂きたいのは、変数に代入されているテキスト(改行を含まない一行テキスト)を、違う別のファイルに登録されている単語を削除したい。というものです。 その別ファイル(削除すべき単語が登録されているファイル)は、 1 2 3 、 。 のように登録されていており、削除する際、 //変数、$moto_txtに長文の1行テキストが代入されてる。 $file_name = "./data/key.txt";//排他単語の取得 if(file_exists($file_name)){  $f_data_array = file($file_name);  $f_cnt= count($f_data_array);  for($h=0; $h<$f_cnt; $h++){   $delete_key = trim($f_data_array[$h]);   $moto_txt = str_replace($delete_key, "", $moto_txt);//  } } のように、削除したい単語が登録されているファイルを単語単位で配列に格納し、for文で$moto_txtからstr_replace()を使って削除しようとすると、何故か他の文字(今確認しているのは、「ア」です)まで削除されてしまう状況となっております。 何か他の方法はないかな?と色々と調べているのですが、その方法が分からず、また、上記の流れで、何故他の単語まで削除されてしまうのかが分かりません。 どんな些細なことでも結構ですので、アドバイスいただけると幸いです。

    • ベストアンサー
    • PHP
  • ファイル読込時に構造体の文字列ポインタに割当てたいと

    ファイル読込時に構造体の文字列ポインタに割当てたいと思っています。 (new 演算子を使用します。) 文字列の長さが不定です。 どうすれば、文字列の長さを知ることができますか? 以下のようなところまでは作れましたが、 困っています。 void loaddata()のfscanf関数の部分です。 ほかにも関数の void outputdata() void deletedata() がありますが、長いので省略しました。 ********************************************************** #include<stdio.h> #include<string.h> class data { public: struct basic { char *name; int age; struct basic *next; }; private: struct basic *base; struct basic *base_top; int cnt; public: data::data() { cnt=0; } void inputdata(char *name,int age) { if(cnt==0) { base=new basic; base_top=base; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } else { base->next=new basic; base=base->next; base->age=age; int len=strlen(name); base->name=new char[len+1]; strcpy(base->name,name); cnt++; } } void savedata() { base=base_top; FILE *fp; fp=fopen("dat.txt","w"); for(int i=0;i<cnt;i++) { fprintf(fp,"%s\t%d\n",base->name,base->age); base=base->next; } fclose(fp); } void loaddata() { if(cnt!=0){deletedata();} cnt=0; FILE *fp; fp=fopen("dat.txt","r"); while(1) { fscanf(fp,"%s\t%d\n",base->name,base->age); } } };

  • ハイライト表示が消えてしまう

    フレームを使って、右側のリンクリスト(right.html)をクリックした際に、左側に表示されたHTMLの文言をハイライト表示させたいと思っています ある程度は出来てきたのですが、一瞬ハイライトしてすぐに消えてしまうのです・・・ どなたかお助けして頂けませんでしょうか 宜しくお願い致します ~index.html~ <head> <meta content="text/html; charset=Shift-JIS" http-equiv="content-type"> <title>ハイライト表示</title> </head> <frameset cols="1031,*" frameborder="no" border="0" framespcing="0"> <frame src="#" scrolling="yes" id="left" name="left"> <frame src="right.html" scrolling="yes" id="right" name="right" noresize="noresize"> </frameset> <body> </body> </html> ~right.html~ <head> <meta content="text/html; charset=Shift-JIS" http-equiv="content-type"> <script language="javascript"> <!-- function change(str,url){ parent.left.location.href=url;  var re=new RegExp(str,"g"); var b=parent.left.document.body; var ss=b.innerHTML; b.innerHTML= ss.replace(re,"<span style=\"background:#77ff77;font-weight:bold\">"+str+"</span>"); } //--> </script> </head> <body> <ls><a href="#" onclick="change('建物','left_1.html')">left_1.html</a></ls> <ls><a href="#" onclick="change('建物','left_2.html')">left_2.html</a></ls> <ls><a href="#" onclick="change('建物','left_3.html')">left_3.html</a></ls> </body> </html> ちなみにleft_1.html等のリンク先のHTMLは修正する事が出来ません 何卒宜しくお願い致します

  • ファイルを読み込んで表示すると文字化けします

    次のようにファイルを読み込んでIEやGoogle Chromeで表示させると 日本語の文字化けが起こってしまいます・・・ どのようにすれば解決できるのでしょうか? [1.txt] ああ いい $file_name = "./1.txt"; if(is_file($file_name)){ $text = fopen($file_name,'r'); for($line = 1; !feof($text); $line++){ $lines = fgets($text); if($lines){ //print $lines; $pairs[] = preg_split('/ /', $lines); } } fclose($text); }else{ exit; } print_r($pairs);

    • ベストアンサー
    • PHP
  • 文字列の置き換えについて

    下記のようなテキストファイルを読み込みます。 【お名前】 {@name} 【フリガナ】 {@kana} 【年齢】 {@age} そしてphpでこのようにしました。 $test = array( 'name' => '名前太郎', 'kana' => 'ナマエタロウ', ); $file = 'body.txt'; $body = file_get_contents($file); foreach ($test as $key => $val) { if ( is_array( $val ) ) { foreach ( $val as $val2 ) { $body = preg_replace( "/{@$key}/u", implode(',', $val), $body ); } } else { $body = preg_replace( "/{@$key}/u", $val, $body ); } } echo $body; 結果は、@nameと@kanaは配列にある通りの文字列に変わりますが@ageは そのまま表示されてしまいます。 $testの配列で該当するパターンがない場合には@hogeの値を空白にしたいのですが どうすればいいでしょうか? foreachを$testで行っているのでループ内ではできないような気がしています。 いい方法があれば教えてください!

    • ベストアンサー
    • PHP
  • 受け取ったデータを基にファイルを操作

    お世話になっております。 以下の内容に行き詰まっております。アドバイスのほど頂戴出来ればと投函しました。宜しくお願いいたします。 やりたいこと。 GETにて受け取ったデータ(URL)を基に、同じディレクトリ内のデータファイル(data.txt)に登録のあるデータから、受け取ったURLを削除した内容で書き換えたい。 ※data.txtは、行単位で各データがタブ区切りで以下のように登録されている。 URL 日付 メール … URL 日付 メール …   現状の報告 以下のスクリプトが実際に作成したものですが、現在、受け取っただけではファイル内容を書き換えることが出来ず、リロードしないと駄目な状況となっています。 アドバイス頂きたいこと。 1.スクリプト自体におかしなところ、見直すべきところがあるか? 2.data.txtを書き換えるスクリプトで、もっと効率のよいものはあるか? 以下がその現在のスクリプトです。 <?php $url = $_GET["url"]; $addfname = "./data.txt"; @$data_array = file($addfname); $data_cnt = count($data_array); $data_array2 = $data_array; $s=0; for($i=0; $i<$data_cnt; $i++){  $data_text = explode("<>", $data_array[$i]);  if($url == $data_text[0]){//GETデータと同じURLだったら配列から削除   $s++;   $key = $i - $s + 1;   array_splice($data_array2, $key, 1);  } } //data.txtのデータ上書き $file=fopen("$addfname", "w") or die("OPENエラー $file_name"); flock($file, LOCK_EX); for($i=0; $i<count($data_array2); $i++){ $new_data = $data_array2[$i]; fputs($file, "$new_data"); } flock($file,LOCK_UN); fclose($file); ?> 先にも述べましたが、現状ではこのスクリプトを実行した後、リロードしなければファイル(data.txt)の書き換えが出来ない状況となっています。どんな些細なことでも構いません。ご意見、アドバイスを頂戴できれば幸いです。お忙しい中恐縮ですが宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 文字列変換について

    質問させてください。 携帯のサイトで各種(Vodafone, au)携帯電話からBBSに感想を入力する画面を作成しました。 入力される文字列は文字、数字、絵文字があります。 入力されたデータはPostgreSQLのDBに格納しています。 その格納された文字列(絵文字含む)を各種携帯で 表示してみたところ、お互いの絵文字が問題に なったため、変換処理を追加しました。 ======================================== $msg = "********";(DBから取得した文字列(絵文字含む)) $emoji = file(emoji_file.txt); for($r=0;$r<count($emoji);$r++){ $string = chop($emoji[$r]); $emoji_data = split("===", $string); if(strstr($msg, $emoji_data[0])){ echo("HIT"); $msg = eregi_replace($emoji_data[0], $emoji_data[1], $msg); } } echo($msg); ====================================== emoji_file.txt $Fr===1 $G-===281 $G.===287 ====================================== 上記のプログラムで、 DBから取得した文字列内にemoji_file.txt にある絵文字データがあれば数値に変換したいと 考えていますが、"HIT"が表示されるにも かかわらず変換されずに表示されます。 これは、"$G."などVodafoneの絵文字が 普通の文字列と違うからでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • オブジェクトと文字列の比較

    いつもお世話になっております。 オブジェクト型(object)と文字列(string)の比較がうまくいかずに 困っている次第です。 ご教授願えないでしょうか。 [sample.xml} <item> <data0> <cd>00001</cd> <nm>yahoo</nm> </data0> <data1> <cd>00002</cd> <nm>google</nm> </data1> [php] $nm = 'google' $filename = sample.xml $j = 0; if($xml = simplexml_load_file($file_name)){ $cnt = count($xml); for($i=0; $i<$cnt; $i++){ $data = 'data' .$i; if($nm != $xml->$data->nm){ $data[$j++] = $xml->$data->nm; } } } 上記とした際、$nm != $xml->$data->nm が有効な比較となりません。 gettypeで調べたら、$nmはstring $xml->$data->nmはobjectとなっていたので、 オブジェクトをstrvalで変換をしてみたのですが変わらず。 どうにか比較できるようにしたいのですが、 お手数ですが、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • csvの特定キーワード抽出後、その前後のキーワードを表示するには

    csvの特定キーワード抽出後、その前後のキーワードを表示するには -----sample.csv f01,名前01,説明01 d03,名前02,説明02 y12,名前03,説明03 -----呼び出しhtml sample.php?key=d03 -----sample.phpの処理 <?php $file_name = "sample.csv"; $file = @fopen($file_name, "r") or die("Data File Open Error"); flock($file, LOCK_SH); while (!feof($file)) { $buf = fgets($file, 4096) ; $data = split(",", $buf) ; if ($data[0] == $_GET["key"]) { $sampleid = $data[0] ; $samplename = $data[1] ; $sampleexp = $data[2] ; } } flock($file, LOCK_UN); fclose($file) ; ?> <h1><?php echo $samplename ?></h1> <h2><?php echo $sampleid ?></h2> <p><?php echo $sampleexp ?></p> 上記のようなフローの時に、sample.csv内の前後のデータをsample.php内で呼び出したいのですが、どうコードを書けばいいのかご教示ください。↓ <a href="ひとつ前のデータ">ひとつ前のデータ</a> <a href="ひとつ後のデータ">ひとつ後のデータ</a>

    • ベストアンサー
    • PHP
  • 【Smarty】連想配列のキーの文字列、変数の結合について

    Smartyで連想配列のキーにある文字列、変数の結合の方法が分からないので質問させていただきます。 通常のphpで $data['name'.$cnt] といった書き方をSmartyのテンプレート側で書く場合はどのようにすれば良いのでしょうか? 「|cat:」や「`(バッククォート)」等、一通り試しましたがうまく表示されません。 宜しくお願い致します。

    • 締切済み
    • PHP