web-dev-qa-db-ja.com

Javascriptで英数字をチェックする最良の方法

JSPのINPUTフィールドで英数字チェックを実行する最良の方法を提案してください。私は現在のコードを添付しましたが、完璧に近い場所はありません:)

<script type="text/javascript">
  function validateCode(){
      var TCode = document.getElementById('TCode').value;
      for(var i=0; i<TCode.length; i++)
      {
        var char1 = TCode.charAt(i);
        var cc = char1.charCodeAt(0);

        if((cc>47 && cc<58) || (cc>64 && cc<91) || (cc>96 && cc<123))
        {

        }
         else {
         alert('Input is not alphanumeric');
         return false;
         }
      }
     return true;     
   }
89
t0mcat

this regex/^[a-z0-9]+$/iを使用できます

85
Mahesh Velaga

str.charCodeAt(i)を使用するアスカーの当初の傾向は、正規表現の代替よりも高速であるように見えます。 jsPerfでの私のテスト では、RegExpオプションはChrome 36で66%遅くなります(Firefox 31ではわずかに遅くなります)。

以下は、文字列を受け取ってtrueまたはfalseを返す元の検証コードのクリーンアップバージョンです。

function isAlphaNumeric(str) {
  var code, i, len;

  for (i = 0, len = str.length; i < len; i++) {
    code = str.charCodeAt(i);
    if (!(code > 47 && code < 58) && // numeric (0-9)
        !(code > 64 && code < 91) && // upper alpha (A-Z)
        !(code > 96 && code < 123)) { // lower alpha (a-z)
      return false;
    }
  }
  return true;
};

もちろん、読みやすさなど、他の考慮事項もあります。 1行の正規表現を見ると間違いなくきれいです。ただし、速度に厳密に関心がある場合は、この代替手段を検討することをお勧めします。

正規表現で確認してください。

Javascript正規表現にはPOSIX文字クラスがないため、文字範囲を手動で記述する必要があります。

if (!input_string.match(/^[0-9a-z]+$/))
  show_error_or_something()

ここで、^はストリングの始まりを意味し、$はストリングの終わりを意味し、[0-9a-z]+0から9までの1つ以上の文字を意味しますORからaからzまで。

Javascriptの正規表現の詳細については、こちらをご覧ください。 https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

33
Mischa Arefiev

一度に1つずつ行う必要はありません。 not alpha-numericのテストを行ってください。見つかった場合、検証は失敗します。

function validateCode(){
    var TCode = document.getElementById('TCode').value;
    if( /[^a-zA-Z0-9]/.test( TCode ) ) {
       alert('Input is not alphanumeric');
       return false;
    }
    return true;     
 }

非英数字の一致が少なくとも1つある場合、return falseになります。

32
user113716

Stringプロトタイプメソッドを作成します。

String.prototype.isAlphaNumeric = function() {
  var regExp = /^[A-Za-z0-9]+$/;
  return (this.match(regExp));
};

次に、使用法は次のようになります。

var TCode = document.getElementById('TCode').value;
return TCode.isAlphaNumeric()
7
Justin
    // On keypress event call the following method
    function AlphaNumCheck(e) {
        var charCode = (e.which) ? e.which : e.keyCode;
        if (charCode == 8) return true;

        var keynum;
        var keychar;
        var charcheck = /[a-zA-Z0-9]/;
        if (window.event) // IE
        {
            keynum = e.keyCode;
        }
        else {
            if (e.which) // Netscape/Firefox/Opera
            {
                keynum = e.which;
            }
            else return true;
        }

        keychar = String.fromCharCode(keynum);
        return charcheck.test(keychar);
    }

さらに、 この記事 は、JavaScriptの英数字の検証を理解するのにも役立ちます。

5
Neerajan

すみません、論争はありません。しかし、ここ数年で私が成長したようにコミュニティが成長するためには、いくつかのメモをとることは良いことです。

実際の英数字文字列は"0a0a0a0b0c0d"のようなもので、"000000""qwertyuio"のようなものではありません。

ここで読んだすべての答えは、どちらの場合もtrueを返しました。そして私を許して、私見、これは正しくありません

"00000"文字列が英数字であるかどうかを確認したい場合、「人間」の答えは間違いなくFALSEです。

どうして?シンプル。文字が見つかりません。したがって、単純な数値文字列[0-9]です。

一方、"abcdefg"文字列を確認したい場合、「人間」の答えは偽です。数字が表示されないため、英数字ではありません。ただアルファ[a-zA-Z]

Michael Martin-Smucker's answer が光っています。

しかし、彼は正規表現ではなく、より良いパフォーマンスを達成することを目指していました。低レベルの方法を使用すると、パフォーマンスが向上します。しかし、結果は同じです。文字列"0123456789"(数値のみ)、"qwertyuiop"(アルファのみ)、および"0a1b2c3d4f4g"(英数字)は、TRUEを英数字として返します。同じ正規表現/^[a-z0-9]+$/iの方法。正規表現が機能しない理由は、明らかなように単純です。構文[]は、orを示し、andではありません。したがって、数字のみの場合または文字のみの場合、regexはtrueを返します。

しかし、 Michael Martin-Smucker's answer はそれでも光を放ちました。私のために。 「低レベル」で考え、英数字文字列を明確に処理する実際の関数を作成することができました。 PHP相対関数ctype_alnumのように呼び出しました。

コードは次のとおりです。

function ctype_alnum(str) {
  var code, i, len;
    var isNumeric = false, isAlpha = false; //I assume that it is all non-alphanumeric



  for (i = 0, len = str.length; i < len; i++) {
    code = str.charCodeAt(i);


        switch (true){
            case code > 47 && code < 58: // check if 0-9
                isNumeric = true;
                break;
            case (code > 64 && code < 91) || (code > 96 && code < 123): //check if A-Z or a-z
                isAlpha = true;
                break;
            default: // not 0-9, not A-Z or a-z
                return false; //stop function with false result, no more checks

        }

  }

  return isNumeric && isAlpha; //return the loop results, if both are true, the string is certainly alphanumeric
};

...そして、これが DEMO

この議論に来たのは、PHP関数に代わるJavaScriptを探していたからです。 「すぐに使える」という答えは見つかりませんでしたが、Stackoverflowでよくあるように、知識と互いの比較の概念は崇高なものであり、あなたは 誰かの答え そして、together探しているソリューションを見つけましたが、あなたはそれを知っているとは思わなかった。

そして共有しましょう!

ベスト

オスカー

1
Oscar Zarrus

Input_stringが英数字かどうかを確認するには、次を使用します。

input_string.match(/[^\w]|_/) == null
0
Mark Baaijens

タイトなループでは、おそらく正規表現を避けてキャラクターをハードコードする方が良いでしょう:

function isAlphanumeric(char) {
    return "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(char) > -1;
}
0
Malganis