入力フォームに半角チェックをつける手法をあれこれ。
#fj.comp.lang.javascriptにPOSTしたのをまとめてみました。


1.ASCIIコードで判定

入力された文字列を一文字ずつASCIIコードをみることで半角英数字かどうかをチェックします。
数字の0~9のASCIIコードは48~57(10進)、A~Zは65~90、a~zは97~122なので、
チェック対象のASCIIコードがこの範囲内にあれば入力O.K.という処理です。
入力に記号や半角スペース、半角カナも含める時には作り変えが面倒です。
#手を抜いて0以上255以下でもいいのか...


スクリプト
  function check1(form){
    str = form.text1.value;
    err = 0;
    for (i=0;i<str.length;i++){
      code = str.charCodeAt(i);
      if ((48<=code && code <=57) || (65<= code && code <=90) || (97 <= code && code <= 122))
        //真だったら何もしない
      else err++;
    }
    if (err!=0) alert('入力は半角英数字でお願いします。');
      else alert('エラーはありません');
  }

2.入力可能文字列を定義

入力された文字が、定義した文字列に含まれるかで判定。
半角スペース、記号などを必要に応じて追加できるところが便利。
入力可能な全角文字の指定も簡単にできるので汎用性は一番高い。

スクリプト
  okstr = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

  function check2(form){
    str = form.text2.value;
    err = 0;
    for (i=0;i<str.length;i++){
      if (okstr.indexOf(str.charAt(i)) == -1) err++;
    }
    if (err!=0) alert('入力は半角英数字でお願いします。');
    else alert('エラーはありません');
  }

3.全角が含まれているかチェック

入力された文字列中に全角が含まれているかで判断。
SJISの2byte文字の1byte目の範囲は、&H81~&H9F, &HE0~&HFCなので、この部分を判定材料にしています。
2byte文字を扱えないNetscape4.0系のブラウザでは工夫が必要です。
半角全体が入力O.K.の場合に効果が発揮されます。

スクリプト
  function check3(form){
    str = form.text3.value;
    err = 0;
    for (i=0;i<str.length;i++){
      str2 = str.charAt(i);
      c  = escape(str2);
      ci = eval('0x' + c.charAt(1))
      if (ci==8 || ci==9 || ci==14 ||ci==15) err++;
    }
    if (err!=0) alert('入力に全角が含まれています。');
    else alert('エラーはありません');
 }

4.ループは嫌じゃー、とにかく速く

これまでのscriptは入力された文字列を一文字ずつチェックしてました。
「ループは遅いから嫌だよー」という方のために簡易ながらスッキリとしたチェック法を。
方法は、escapeをしたときに%が付かない文字(16進で返されない)を入力O.K.とします。
具体的には、半角英数字&四則演算子&アンダースコア&ピリオドが入力可能となります。

スクリプト
  function check4(form){
    str = escape(form.text4.value);
    if (str.indexOf('%') != -1)
      alert('入力にエラーがあります。');
    else alert('エラーはありません');
 }

5.正規表現を使って

入力が連続した半角英数字の文字列と見立て、正規表現を用いてチェックします。
チェック対象の文字列がマッチさせた後の文字列と等しければエラーなしになります。
マッチタイプの文字を適当に変更してみてください。

スクリプト
  function check5(form){
    str = form.text5.value;
    var tmp = str.match(/[0-9a-zA-Z\+\-\/\*\,\. ]+/g);
    if (tmp != str)
      alert('入力にエラーがあります。');
    else alert('エラーはありません');
 }

설정

트랙백

댓글