配列[i]同士の置換を実行すると、ブラウザか固まります…

[新着] Webテンプレートを仮オープンしました



0   名前: なつき : 2006/11/02(木) 09:06  ID:K4mLUhoy
どうしても正常に動作しない原因の検討がつかないので、質問させてください。

【何をしたいのか】
テキストの中の、特定のいくつかの漢字を自動で赤字にしたいと思っています。

【現在の状況】
特にエラーはないと思うのですが、実行させるとブラウザが固まってしまいます…

【何をしてみたのか】
赤字にしたい漢字を配列に格納し、配列の数だけ検索・置換え処理を繰り返すソースを書いたつもりです。
以下ソースです。
my3 = new Array("悪","安","暗","医","委","意","育","員","院","飲","運","泳","駅","央","横","屋","温","化","荷","界","開","階","寒","感","漢","館","岸","起","期","客","究","急","級","宮","球","去","橋","業","曲","局","銀","区","苦","具","君","係","軽","血","決","研","県","庫","湖","向","幸","港",
"号","根","祭","皿","仕","死","使","始","指","歯","詩","次","事","持","式","実","写","者","主","守","取","酒","受","州","拾","終","習","集","住","重","宿","所","暑","助","昭","消","商","章","勝","乗","植","申","身","神","真","深","進","世","整","昔","全","相","送","想","息","速",
"族","他","打","対","待","代","第","題","炭","短","談","着","注","柱","丁","帳","調","追","定","庭","笛","鉄","転","都","度","投","豆","島","湯","登","等","動","童","農","波","配","倍","箱","畑","発","反","坂","板","皮","悲","美","鼻","筆","氷","表","秒","病","品","負","部","服",
"福","物","平","返","勉","放","味","命","面","問","役","薬","由","油","有","遊","予","羊","洋","葉","陽","様","落","流","旅","両","緑","礼","列","練","路","和");
 function allReplace(text, str, str2) {
     while (true) { 
     text2 = text;
     text = text2.replace(str, str2);
     if (text == text2) {
      break;  
     }
    }
    return text;
   }

 t1 = "黒板に吊した大きな黒い星座の図の、上から下へ白くけぶった銀河帯のようなところを指しながら、みんなに問をかけました。";

//漢字の検索・置換
 
for(i=0; i<200; i++){
   t1 = allReplace(t1,my3[i],"<span style='color:#ff0000'>"+my3[i]+"<\/span>");
}
  document.write(t1);

【備考】
・配列ではなく、ただの文字列などに置換させると、正常に動きます。
・置換用に同じ内容の配列をもうひとつ作り、そちらに置換させようとしても、やはり動きません。
・内容がまったく異なる配列で置換させると、正常に動きます。
・同じ内容同士の配列では、置換ができないのでしょうか?

私は置換以外の手段が思い浮かばなかったのですが、もし他に有効な方法があるのでしたら、そちらも併せてご教授いただきたいと思います。
よろしくお願いいたします。

1   名前: m035 ◆Wpzr1YKOiq : 2006/11/02(木) 09:06  [URL]  ID:He.BzoXq
>・配列ではなく、ただの文字列などに置換させると、正常に動きます。

 function allReplace(text, str, str2) {
     while (true) { 
     text2 = text;
     text = text2.replace(str, str2);
     if (text == text2) {
      break;  
     }
    }
    return text;
   }

 t1 = "黒板に吊した大きな黒い星座の図の、上から下へ白くけぶった銀河帯のようなところを指しながら、みんなに問をかけました。";
//漢字の検索・置換 
t1 = allReplace(t1,"黒","<span style='color:#ff0000'>黒<\/span>");
document.write(t1);

以上のようにしても、無限ループに陥ってしまうと思いますが。
そもそも、spanで囲んだ部分も置換対象になってしまうので置換は終わりません。
var my3=new Array("悪","安","暗","医","委","意","育","員","院","飲","運","泳","駅","央","横","屋","温","化","荷","界","開","階","寒","感","漢","館","岸","起","期","客","究","急","級","宮","球","去","橋","業","曲","局","銀","区","苦","具","君","係","軽","血","決","研","県","庫","湖","向","幸","港",
"号","根","祭","皿","仕","死","使","始","指","歯","詩","次","事","持","式","実","写","者","主","守","取","酒","受","州","拾","終","習","集","住","重","宿","所","暑","助","昭","消","商","章","勝","乗","植","申","身","神","真","深","進","世","整","昔","全","相","送","想","息","速",
"族","他","打","対","待","代","第","題","炭","短","談","着","注","柱","丁","帳","調","追","定","庭","笛","鉄","転","都","度","投","豆","島","湯","登","等","動","童","農","波","配","倍","箱","畑","発","反","坂","板","皮","悲","美","鼻","筆","氷","表","秒","病","品","負","部","服",
"福","物","平","返","勉","放","味","命","面","問","役","薬","由","油","有","遊","予","羊","洋","葉","陽","様","落","流","旅","両","緑","礼","列","練","路","和");
var t1="黒板に吊した大きな黒い星座の図の、上から下へ白くけぶった銀河帯のようなところを指しながら、みんなに問をかけました。";
function allReplace(text,keyword){
return text.replace(new RegExp(keyword,"g"),"<span style='color:#ff0000'>$&<\/span>");
}
for(i=0;i<200;i++){
t1=allReplace(t1,my3[i]);
}
document.write(t1);

以上のようにreplaceでgフラグを立てておけば一度にマッチする文字を置換できます。
また、以下のようにsplitで置換対象の文字を区切り文字として配列化し、joinで配列をつなげて文字列に戻しても全置換できます。
function allReplace(text,keyword){
return text.split(keyword).join("<span style='color:#ff0000'>"+keyword+"<\/span>");
}

2   名前: 匿名 : 2006/11/02(木) 09:06  ID:7HlzC/hv
見た感じではループを使う理由がないので

var my3 = [ '悪', '安', '暗', ...... ];
var t1 = '黒板に吊した大きな......';

var regex = new RegExp ('[' + my3.join ('') + ']', 'g');
document.write (t1.replace (regexp, '<span style="color: #f00">$&<\/span>'));


これだけで十分だし、この方が比較にならないほど処理が速い。そもそも配列にする必要もなく、最初から

var regex = /[悪安暗医委......]/g;


と正規表現を書けば済む話のような気がします。

3   名前: 匿名 : 2006/11/02(木) 09:06  ID:msY6l1k3
>>1 m035様
>>2 匿名様

ご指導ありがとうございました、おかげで解決いたしました!

4   名前: なつき : 2006/11/02(木) 09:06  ID:JEFUZzom
↑質問者のなつきです。
自分が匿名になってしまいました…


一覧へ戻る