JavaScriptで文字列の中から特定の文字を検索する方法について解説

HOME
更新日:2013.10.04
HOMEJavaScript入門 > 文字を検索する

文字を検索する

このページでは、文字列の中から任意の文字を検索する方法について解説します。 と言っても既に何度か検索命令文indexOf()は出てきたので、 これを使って文字列置換を行ってみたいと思います。

indexOf()による文字の検索と置換

JavaScriptを使って長い文章を表示する場合、 または複雑なHTMLタグを用いる場合、 タグを何かの文字に置き換えておいて、 表示する時にタグに戻すとスッキリします。 以下のスクリプトは強調タグ<strong></strong>を「##」「%%」に置き換え、 document.write()で表示する前にタグに戻しています。

<script>

//長い文字列を配列に格納
var str = new Array(
"文字を検索するには、##indexOf()%%を使います。",
"括弧内には##検索文字列%%と、##検索開始位置%%を指定します。",
"検索文字が存在すると、##文字の位置%%を返します。",
"検索文字が存在しないと、##-1%%を返します。"
);

//配列の文字列を順番に表示
for ( var i = 0 ; i < 4 ; i++ )
{
  //while文を使って無限ループにする
  while(true)
  {
    //「##」を検索し、文字位置を変数numに代入
    var num = str[i].indexOf("##",0);

    //もし「##」が無ければ、無限ループから出る
    if (num == -1) break;

    var tag = "<strong>";

    //「##」の前まで切り取る
    var str1 = str[i].substring(0,num);
 
    //「##」の後ろを切り取る
    var str2 = str[i].substring(num+2,str[i].length);

    //「##」を変数tagに代入したHTMLタグに置き換える
    str[i] = str1 + tag + str2;
  }
  
  //終了タグに関しても同様の処理をする
  while(true)
  {
    var num = str[i].indexOf("%%",0);
    if (num == -1) break;
    var tag = "</strong>";
    var str1 = str[i].substring(0,num);
    var str2 = str[i].substring(num+2,str[i].length);
    str[i] = str1 + tag + str2;

  }
  //HTMLに置き換えられた文字列を表示
  document.write(str[i]);
}

</script>

サンプル(別窓)

スクリプトの解説

では上記のソースについて見ていきましょう。 最初に配列strに表示する文字列を記入しています。 開始タグの位置に「##」、終了タグの位置に「%%」を記入します。

続いてfor文を使って、配列の文字列を順に表示していきます。 しかしdocument.write()で表示する前に、HTMLタグを組み込む処理を行います。

while文を使った文字の置換処理部分について見て下さい。 while文を使うのは、str[i]の中に何回「##」が出てくるか分からないからです。 while()の括弧内は繰り返し条件を記入するのですが、今回はtrueとしました。 つまり無限に繰り返すように指定した訳です。

while文の中で、最初に「##」の位置を調べます。 ここで使うのがindexOf()ですが、おさらいしておきましょう。

文字列.indexOf(検索文字,検索開始位置)
文字列の中から特定の文字を検索し、存在すればその位置を取得します

「##」の位置を変数numに格納します。 もし存在しなければ変数numには-1が入るので、 if文で「##」が存在しているかどうか調べます。 もし無いのであれば、変換処理が終了しているということです。 breakを使って無限ループから脱出します。 この処理を忘れたらブラウザが暴走するので、絶対忘れないようにしましょう。

変数tagに、置換するHTMLタグを代入します。 変数str1には「##」の前までの文字を、変数str2には「##」の後ろの文字を抜き出します。 文字の抜き出しはsubstring()を使います。後ろ側を抜き出す時の開始位置ですが、 indexOf()で取得した「##」の位置に2文字(つまり##)を加えた所となります。 終了位置はlengthを使って文字列長を取得すればOKです。

最後にstr[i]を、「##」をHTMLタグに置き換えた文字列に書き換えています。 「##」が複数あれば再びWhile文の中で置き換えが行われ、 「##」が存在しなくなるまで繰り返されます。

終了タグの置き換えについても同様の処理を行っています。


今回見たwhile文を使った無限ループは良く使います。 勿論下のようにきちんと条件を指定することも可能です。

while( str[i].indexOf("##",0) != -1 )
{
  置換処理
}

個人的には無限ループを使う方が好きなのですが、 条件をきちんと記入した方が理解しやすいかも知れません。 どちらでも好きな方を使ってください。 ただし無限ループは抜け出す処理を書き忘れないように気をつけて下さい。