もっと便利に!jQueryでラクラクサイト制作(実践サンプル付き)

第11回今すぐできる!ユーザビリティを向上させるフォーム操作実践(3)

前回に引き続き正規表現

前回JavaScriptで行うバリデーション(フォームの入力項目の正当性チェック)の例をご紹介しました。主に正規表現を使うための説明をしたのですが、内容の理解については大丈夫でしょうか?

正規表現の利用については、多くの人が悩む部分だと思います。この正規表現の利用は、JavaScriptだけでなく、他のプログラムでも使われたりしますし、また、Dreamweaverやその他各種テキストエディターなどでも、正規表現を使っての検索ができるようになっていますので、それらを使っての練習もしてみてはいかがでしょうか?

今回も前回に引き続き、JavaScriptで行うバリデーションを実装例を紹介しますが、その前に、今回は少しだけ、正規表現をエディタで行う練習をしてみましょう。

Dreamweaverで正規表現の練習

本日の実践例を紹介する前に、Dreamweaverを使って、正規表現を使っての検索例をご紹介いたします。

Dreamweaverを使い作業をされている方が多いと思うのですが、Dreamweaverには、正規表現での検索ができるようになっています。ここで正規表現を使うということはあまり無いのかもしれないですが、知っていると便利な場面も多々あります。

例えば、imgでsrc="○○.jpg"となっている部分だけを検索したいような時があったとします。正規表現を使わない検索を使わない場合は、⁠.jpg」の拡張子で検索したり、⁠src="○○」と、部分的に抜き出して検索するなんてことをすると思います。しかし、拡張子だけの検索だと、例えばアンカータグ(aタグ)のhref属性にも「.jpg」へのリンクをつけてしまっているような場合は、それすらも検索でひっかかってしまいます。また「src="」で検索した場合は、該当の箇所以外のsrc属性もひっかかってくる事態にもなります。

正規表現を使うと、それらの余計な部分が検索時にひっかからないようにすることができます。

src属性で「.jpg」のものを検索

今回のように、src属性の中でも「.jpg」になっている部分だけを検索するには、下記のように指定をします。

src属性の「○○.jpg」となっている部分だけ検索
src=".+\.jpg"
Dreamweaverのコードを正規表現で検索する例
Dreamweaverのコードを正規表現で検索する例
Dreamweaverのコードを正規表現で検索する例(コード上)
Dreamweaverのコードを正規表現で検索する例(コード上)
Dreamweaverのコードを正規表現で検索する例を分解
パターン(赤文字部分)説明
src="src="の文字
.+半角ドットが任意の1文字、プラスが直前の文字が1文字以上、それが組み合わされて、任意の1つ以上の文字
\.半角ドット1文字 (半角ドットはメタ文字のためエスケープが必要)
jpg"jpg"の文字

これで、src属性の中から「.jpg」だけを検索できます。今回はわかりやすいようにsrc属性全体(src="")を対象にできるようにしたのですが、下記のようにしても同様に検索することが可能です。

src属性の「○○.jpg」となっているタグだけ検索 その2
src.+\.jpg

イコール(=)とダブルクォーテーション("")を含めていないだけですが、これでも検索が可能です。

また、今回は任意の1文字を対象に「.+」を利用したのですが、今回の例であれば「.*」でも同様の結果を得ることができます。

覚えておくと便利な正規表現検索

先ほどの例の他にも、覚えておくと便利な正規表現の検索はいくつもあります。しかし、たくさん覚えておくというのも難しいので、ものすごく簡単な例だけをいくつかあげておきます。

改行を含む検索

Dreamweaverであれば、正規表現を使わずとも、任意の改行を含む文字列を検索してくれますが、正規表現でそれを行う場合は前回もご紹介した、定義済み文字クラスを利用します。

改行を含む任意の文字列を検索
○○○○\n○○○○

○○部分は任意の文字例です。○○が決まっていいる場合は、正規表現を使っていなくとも検索することは可能ですが、例えば「決まった文字列+改行+何か文字・・」というような場合は、正規表現を使う方が便利なので、これは覚えておくと便利です。

Dreamweaverのコードを正規表現で検索する例
Dreamweaverのコードを正規表現で検索する例

タブを含む検索

これも前回ご紹介済みですが、タブを含む検索も楽にできます。

タブを含む検索
\t

これだけでタブを検索することができます。個人的には、タブが連続しているような場合の箇所を無くしたりタブ1つ分にしたいなどの時に「\t\t」「\t\t+」などで検索置換などをしています。

Dreamweaverのコードを正規表現で検索する例
Dreamweaverのコードを正規表現で検索する例

改行の無いPタグ全体

最後にもう一つ。一つのPタグを、1行分全体を検索したいような場合、下記のようにしてみます。

改行の無いPタグ全体
<p&gt.+</p>
改行の無いPタグ全体
改行の無いPタグ全体

上記のような場合、属性値が含まれていたり、開始タグから終了タグの間で改行があるような場合は検索対象にはならないのですが、それらが無い場合に検索でひっかかってきます。

また、もう一点注意として、Pタグが改行なしに連続している場合も、複数含まれて該当してしまいます。該当箇所の最初から最後までが引っかかってしまうためのことです。この点だけは注意して覚えておいてください。

今回はDreamweaverのコード上での正規表現の練習例をいくつかご紹介しましたが、他のテキストエディタでも、正規表現検索がある場合は同様のことができます。

しかし、高度な検索例の場合や長くて改行もたくさん含むような検索をする場合は、エディタの結果と実際のブラウザで表示させた時の結果が違ってくる場合も多々あるります。エディタでの練習は、あくまで正規表現の基本的な事だけにしておき、実際のブラウザでのチェックについては、過去のもご紹介してきた、Firebugを使っての方法が一番いいです。

テキストエディタで練習をしたとしても、次のステップではFirebugなどのコンソールを使って練習するようにしてください。

電話番号のバリデーション

さて、正規表現の練習はここまでにして、ここからは前回に続いて、フォームでの実践例をご紹介します。

前回はメールアドレスの入力チェックの例をご紹介しましたが、今回は電話番号、数値のみかどうか、アルファベットのみかどうか、正しいURLの入力か、必須項目の場合…のバリデーション実装例をご紹介します。

まずは電話番号のバリデーションを紹介します。電話番号のバリデーションは、メールほど難しくないのですが、どこまでの入力をチェックするのかを、あらかじめ決めておく必要があります。どこまでというのは、ハイフンを含めた入力にするのか、ハイフンが無くてもいいのかなどです。

それらも含めて、電話番号の入力チェックをいくつかご紹介いたします。

電話番号バリデーションの実装

今回の作りの前提として、一つの入力欄に電話番号を入れるものとします。場合によっては、ハイフンの位置ごとに入力欄を設ける場合もあるのですが、今回は入力欄一つのもので作ります。

この場合、ハイフンを入れておくかどうかで処理が変わってくるのですが、ユーザビリティーを考える場合、どちらでも対応できるようしておくのが便利だと思います。ハイフンなしで入力と書いても、それを見逃してハイフンありで入力してしまう人もいるかもしれないので、そのような人のために、どちらでも対応できるようにしておくのがいいでしょう。

電話番号チェックのコード
jQuery(function($){
  $('#phone').bind('keyup blur',function(){
    var txt = $(this).val();
    var txtRep =  txt.replace(/-/g,'');
    var txtLength = txtRep.length;

    if(txt && txtLength>0){
      if(txtLength===10 || txtLength===11){
        if(txt.match(/\d+-?\d+-?\d+/)){
          $(this).next().remove().end().after('<span class="ok">valid</span>');
        }else{
          $(this).next().remove().end().after('<span class="err">invalid</span>');
        }
      }else{
        $(this).next().remove().end().after('<span class="err">invalid</span>');
      }
      
    }else{
      $(this).next().remove();
    }
  });
});

基本的な作りは前回のものとほぼ同じです。違う点は、正規表現部分と、電話番号の桁数チェックを行うくらいです。

ハイフンを含めていてもいなくとも、数字が10桁もしくは11桁の入力があるまではinvalidを表示し[1]⁠、10・11桁になった時に正規表現のチェックをかけて、番号の入力に問題がないかどうかを調べるようにします。

今回の正規表現は「\d+-?\d+-?\d+」の部分で、下記の通りです。

「\d+-?\d+-?\d+」を分解
パターン(赤文字部分)説明
\d+数値が一文字以上の連続
-?ハイフンを含めるもしくは含めない

文字で書くとしたら「数値の連続+ハイフン(有り無しどちらでも)+数値の連続+ハイフン(有り無しどちらでも)+数値の連続」となります。

繰り返しの「g」

文字数については、HTML側で「maxlength="13"」を入れておくと、ハイフン含め13文字以上は入力ができなくなります。また、正規表現部分で文字数のチェックをいれる方法もあるのですが、上記の例では入れておらず、Script側で、入力の数値が10文字か11文字かをチェックしています。

また、入力のチェックでは、数値だけをチェックしたいので、ハイフンをチェックの歳に抜き取るようにしています。

ハイフンの処理
var txtRep =  txt.replace(/-/g,'');

このコードの「/-/g」の部分は正規表現であり、最後のスラッシュの次に「g」を入れておくと、テキスト全体を繰り返しチェックしてくれるようになります。ちなみに「txt.replace('-','')」としてしまうと、最初のハイフンしか取り除けないので注意です。複数同じ文字を抜き取る場合は、正規表現を使い、最後に「g」を指定するようにしましょう。

11桁チェックの歳の問題

先程のサンプルを使ってみた人は、すでにお気づきかもしれないですが、先程のコードでは、携帯電話などの11桁番号をチェックする前に、10桁の入力があった時点で「valid」の表示が出てしまうようになってしまいます。

10桁時点でvalidになってしまう
10桁時点でvalidになってしまう

これをうまく回避するために、携帯電話番号やIP電話番号の入力の際は11桁の入力にならないとvalidにならないようにする分岐を入れたものを作成してみます。

電話番号バリデーションの実装(その2)

11桁の番号入力があるケースは、携帯電話は090、080の番号と、PHSの070の番号、それとIP電話の050の4パターンが考えられます(ここではフリーダイヤルなどのケースを除きます⁠⁠。つまり、入力部分の最初がそれらの番号の場合は11桁にならないとチェックされないようにするだけです。

電話番号チェックのコード(改良1)
jQuery(function($){
  $('#phone').bind('keyup blur',function(){
    var self = $(this);
    var txt = self.val();
    var txtRep =  txt.replace(/-/g,'');
    var txtLength = txtRep.length;
    
    var message = function(flg){
      var checkClass = flg?'ok':'err';
      var check = flg?'valid':'invalid';
      self.next().remove().end().after('<span class="'+checkClass+'">'+check+'</span>');
    }

    if(txt && txtLength>0){
      if(txt.match(/^0(9|8|7|5)0/)){
        if(txtLength===11){
          if(txt.match(/\d+-?\d+-?\d+/)){
            message(true);
          }else{
            message()
          }
        }else{
          message();
        }
      }else if(txtLength===10){
        if(txt.match(/\d+-?\d+-?\d+/)){
          message(true);
        }else{
          message();
        }
      }else{
        message();
      }
      
    }else{
      $(this).next().remove();
    }
  });
});

先程との変更点は、全体的にコードが長くなったので、validとinvalidを表示させる部分をあらかじめまとめたのと、携帯電話などのための分岐を加えただけです。

分岐が多くなっているので、複雑に見えますが、携帯電話などの番号かどうかのチェックをし、その後桁数のチェック、最後にその入力が正しい電話番号の入力かをチェックしているものになっています。

携帯などのチェックは、最初が090などの番号かどうかという正規表現でチェックをしています。

携帯、PHS、IP電話のチェック
txt.match(/^0(9|8|7|5)0/)
「^0(9|8|7|5)0」を分解
パターン(赤文字部分)説明
^~で始まる
0(9|8|7|5)00×0の形で、且つ、×の部分が9か8か7か5のいずれか(090,080,070,050)

これで携帯番号などの時は11桁の入力が無ければvalidにならないようになりますし、その他の固定電話などの時は10桁でvalidになります。

画像

電話番号バリデーションの実装(その3)

さて、ここまでハイフンがあっても無くても大丈夫なサンプルを紹介しましたが、次はハイフンが無ければエラーになるような実装例も簡単にご紹介します。

電話番号チェックのコード(ハイフン必須)
jQuery(function($){
  $('#phone').bind('keyup blur',function(){
    var self = $(this);
    var txt = self.val();
    var txtLength = txt.length;
    
    var message = function(flg){
      var checkClass = flg?'ok':'err';
      var check = flg?'valid':'invalid';
      self.next().remove().end().after('<span class="'+checkClass+'">'+check+'</span>');
    }

    if(txt && txtLength>0){
      if(txt.match(/^0(9|8|7|5)0/)){
        if(txtLength===13){
          if(txt.match(/0(9|8|7|5)0-\d{4}-\d{4}/)){
            message(true);
          }else{
            message()
          }
        }else{
          message();
        }
      }else if(txtLength===12){
        if(txt.match(/0\d{1,4}-\d{1,4}-\d{4}/)){
          message(true);
        }else{
          message();
        }
      }else{
        message();
      }
      
    }else{
      $(this).next().remove();
    }
  });
});

このサンプルでは、ハイフンなしではvalidにならないようになっています。先程までのはハイフンが入っていた場合、抜き取る仕組みを入れておき、その後に桁数をチェックするようにしていましたが、この例では、その工程を省き、決まった形で入力されない限りvalidにならないように正規表現での分岐を入れています。

携帯、PHS、IP電話のチェック(ハイフン必須)
txt.match(/0(9|8|7|5)0-\d{4}-\d{4}/)
「0(9|8|7)0-\d{4}-\d{4}」を分解
パターン(赤文字部分)説明
0(9|8|7|5)00×0の形で、且つ、×の部分が9か8か7か5のいずれか(090,080,070,050)
-ハイフン(?が無いので必須)
\d{4}半角数字が4文字

携帯などの11桁番号の場合は、⁠3桁-4桁-4桁」の形をとるので、正規表現部分で4桁にマッチするかどうかをチェックしています。

携帯、PHS、IP電話のチェック(ハイフン必須)
txt.match(/0\d{1,4}-\d{1,4}-\d{4}/)
「0\d{1,4}-\d{1,4}-\d{4}」を分解
パターン(赤文字部分)説明
0\d{1,4}0×,0××,0×××,0××××の形式(0と半角数字が1~4文字)
-ハイフン(?が無いので必須)
\d{1,4}半角数字が1~4文字
\d{4}半角数字が4文字

東京23区なら「03」ですし、札幌市なら「011」など、地域によっては市外局番は最初の0を除くと1~4桁が存在するので、どれでも対応するようになっています。{数値}は、直前の文字が数値の回数繰り返すことを表し、{数値1,数値2}は数値1~数値2回繰り返すことを表します。

今回の電話番号バリデーションでは、ハイフンあり・なしどちらでも対応できるものと、ハイフン必須のサンプルをご紹介しました。分岐が多く、複雑ではありますが、電話番号のバリデーションの際に利用してみてください。

数字のみのバリデーション

電話番号チェックのついでに、数値のみが入力されているかどうかをチェックする方法のサンプルもご紹介します。

入力された値が数値かどうかのチェックだけですので、簡単な正規表現のマッチングでチェックすることができます。

数値のみの入力かどうかのチェック
jQuery(function($){
  $('#num').bind('keyup blur',function(){
    var self = $(this);
    var txt = self.val();
    var txtLength = txt.length;

    if(txt && txtLength>0){
      if(txt.match(/^\d*$/)){
        self.next().remove().end().after('<span class="ok">valid</span>');
      }else{
      self.next().remove().end().after('<span class="err">半角数字で入力してください</span>');
      }
    }else{
      $(this).next().remove();
    }
    
  });
});

入力が半角数字ではなければ、⁠半角数字で入力してください」の表示がでるサンプルです。数値だけのマッチングは先程までのサンプルでも紹介していた一部分を使うだけ実装できます。

数値のみの入力かどうか
txt.match(/^\d*$/)
^\d*$
パターン(赤文字部分)説明
^~で始まる
\d*半角数字が繰り返される
$~で終わる

電話番号チェックに組み込んでみる

上記の数値のみの入力かどうかのチェックを、先程までご紹介していた電話番号のチェックに組み込んでみた実装例もご紹介します。

電話番号チェックのコード(数値のみかのチェック付き)
jQuery(function($){
  $('#phone').bind('keyup blur',function(){
    var self = $(this);
    var txt = self.val();
    var txtRep =  txt.replace(/-/g,'');
    var txtLength = txtRep.length;
    
    var message = function(flg){
      var checkClass = flg?'ok':'err';
      var check = flg?'valid':'invalid';
      self.next().remove().end().after('<span class="'+checkClass+'">'+check+'</span>');
    }

    
      if(txt && txtLength>0){
        if(txtRep.match(/^\d*$/)){
          if(txt.match(/^0(9|8|7|5)0/)){
            if(txtLength===11){
              if(txt.match(/\d+-?\d+-?\d+/)){
                message(true);
              }else{
                message()
              }
            }else{
              message();
            }
          }else if(txtLength===10){
            if(txt.match(/\d+-?\d+-?\d+/)){
              message(true);
            }else{
              message();
            }
          }else{
            message();
          }
        }else{
          self.next().remove().end().after('<span class="err">半角数字で入力してください</span>');
        }
      }else{
        $(this).next().remove();
      }
  });
});

数値以外の入力があった場合は「半角数字で入力してください」のエラーが表示されます。

これをいれずとも電話番号チェックの正規表現部分で、数値以外の入力はvalidにならないようになっているのですが、あえて組み込むことによって、数値以外の入力があった際に「半角数字で入力してください」と、エラーの表記を変化させる分岐を入れることができるのです。

なぜエラーなのかを分かりやすくするための分岐として利用してみてください。

正規表現を使わずに数値のみのチェック(おまけ)

今回のサンプルでは正規表現を使いましたが、正規表現を使わない方法もあります。isNaN()を使う例ですが、今回は正規表現を使う例でのご紹介をしておりますので、それはサンプルのみリンクしておきます。

アルファベットのみのバリデーション

数値のみのバリデーションの次は、アルファベットのみの入力をチェックする実装例をご紹介いします。

アルファベットのみの入力かどうかのチェック
jQuery(function($){
  $('#alphabet').bind('keyup blur',function(){
    var self = $(this);
    var txt = self.val();
    var txtLength = txt.length;

    if(txt && txtLength>0){
      if(txt.match(/^[a-zA-Z]*$/)){
        self.next().remove().end().after('<span class="ok">valid</span>');
      }else{
        self.next().remove().end().after('<span class="err">半角英字で入力してください</span>');
      }
    }else{
      $(this).next().remove();
    }
  });
});

入力が半角のアルファベッドではなければ、⁠半角英字で入力してください」の表示がでるサンプルです。数値だけのマッチングと正規表現部分が違うだけです。

半角英字のみの入力かどうか
txt.match(/^[a-zA-Z]*$/)
^[a-zA-Z]*$
パターン(赤文字部分)説明
^~で始まる
[a-zA-Z]*半角英字(半角小文字a~zと半角大文字A~Z)が繰り返される
$~で終わる

数字の入力を許可せずにアルファベットのみの入力にする機会がそれほど多くはないかもしれないですが、そのような時のための参考にしてみてください。

URLのバリデーション

さて、数字のみや、アルファベットのほかに、フォームで利用されそうなバリデーションとしてもう一つ、URLのチェック実装例をご紹介します。

正しいURLの入力かどうかのチェック
jQuery(function($){
  $('#url').bind('keyup blur',function(){
    var self = $(this);
    var txt = self.val();
    var txtLength = txt.length;

    
    if(txt && txtLength>0){
      if(txt.match(/^https?\:\/\/\S+\.\w+/)){
        self.next().remove().end().after('<span class="ok">valid</span>');
      }else{
        self.next().remove().end().after('<span class="err">正しいURLを入力してください</span>');
      }
    }else{
      $(this).next().remove();
    }
  });
});

入力で正しいURLの表記になるまで「正しいURLを入力してください」の表示がでるサンプルです。http://○○.○○~/もしくはhttps://○○.○○~の形をとるまでエラーが表示されます。

正しいURLの入力かどうか
txt.match(/^https?\:\/\/\S+\.\w+/)
^https?\:\/\/\S+\.\w+
パターン(赤文字部分)説明
^~で始まる
?httpもしくはhttps
\:\/\/コロンやスラッシュのエスケープ
\S+空白や改行など以外の文字の繰り返し
\.ドットのエスケープ
\w+英数字の繰り返し

途中で「\S+」を使い、空白や改行など以外が連続されるようにしてみました。その部分も「\w+」と英数字の繰り返しにする方法もあるかもしれませんが、その方法では、日本語ドメインが許可されなくなってしまいます。なのでそこは「\S+」を利用しています。

URLの最初のドット位置の右隣までしかチェックされないことにはなりますが、あくまでここはhttp://ではじまるか、https://と、正しいUSLの入力かどうかのチェックをするだけです。

必須項目のバリデーション

さて、今回の最後に、正規表現を使う例ではないですが、入力必須箇所が入力されているかどうかのチェックを行い、入力が無ければエラーがでる実装例をご紹介します。

HTML
<form>
<dl>
<dt>名前<span class="required">[必須]</span></dt>
<dd><input type="text" id="name" value="" class="required" /></dd>
</dl>
<dl>
<dt>性別<span class="required">[必須]</span></dt>
<dd class="inline checkRequired">
<input type="radio" value="man" id="man" name="gender" /><label for="man">男性</label>
<input type="radio" value="woman" id="woman" name="gender" /><label for="woman">女性</label>
</dd>
</dl>
<dl>
<dt>趣味<span class="required">[必須]</span></dt>
<dd class="inline checkRequired">
<input type="checkbox" name="hobby" id="internet" value="インターネット" class="required" /><label for="internet">インターネット</label>
<input type="checkbox" name="hobby" id="movie" value="映画" /><label for="movie">映画</label>
<input type="checkbox" name="hobby" id="books" value="読書" /><label for="books">読書</label>
</dd>
</dl>
<p><input type="submit" value="送信" /></p>
</form>

上記HTMLはあくまでサンプル用です。サンプル用なので、項目は少なくなっています。

入力必須項目が入力されているかチェック
jQuery(function($){
  $('#name').bind('keyup blur',function(){
    var self = $(this);
    var txt = self.val();
    var txtLength = txt.length;
    
    if(txt && txtLength>0){
      if(txt.match(/^\s/)){
        self.next().remove().end().after('<span class="err">最初に空白は入力できません。</span>');
      }else{
        self.next().remove().end().after('<span class="ok">valid</span>');
      }
    }else{
      self.next().remove().end().after('<span class="err">入力必須項目です。</span>');
    }
  });
  
  $(".checkRequired").bind('keyup blur click',function(){
    var self = $(this);
    if($(":checked",this).length > 0){
      self.children().filter('.err').remove();
    }else{
      self.children().filter('.err').remove();
      self.append('<span class="err">入力必須項目です。</span>');
    }
  });
  
  $('form').submit(function(){
    $('.err').remove();
    $("input.required").each(function(){
      var self = $(this);
      if(self.val()==""){
        self.next().remove().end().after('<span class="err">入力必須項目です。</span>');
      }
    });
    $(".checkRequired").each(function(){
      var self = $(this);
      if($(":checked",this).length == 0){
        self.append('<span class="err">入力必須項目です。</span>');
      }
    });
    return false;
  });
});

チェックするタイミングは、各項目の入力やチェック時と、submit(サンプル上の送信)を押した時です。

テキストボックスの入力判定は「.val()==""」で判定しています。一方ラジオボタンやチェックボックスは、チェックが入っているものを「:checked」「.length」でチェックが入っているものの数をチェックしていて、0個ならエラーと判定されるようになっています。

今回の例ではラジオボタンやチェックボックスの親ボックスに「.checkRequired」を指定することでチェックされるようになっています。

今回の各サンプルは、それぞれコードが長くなっているため、難しく感じるところも多々あると思います。コードが分からないときは、コードの部分部分をそれぞれの一つ一つをチェックしてみたりしてください。

おすすめ記事

記事・ニュース一覧