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


107

INPUTフィールドで英数字チェックを実行する最良の方法は何JSPですか?現在のコードを添付しました

<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;     
   }


2
「最高」の定義方法によって異なります。以下の答えのほとんどは、正規表現を示唆しています。これは、元のコードよりもはるかに遅いパフォーマンスです。私はあなたのコードを少しクリーンアップしました。
Michael Martin-Smucker 2014

回答:


100

この正規表現を使用できます /^[a-z0-9]+$/i


4
もちろん、これは空の文字列("")が一致しないことを前提としています。
zzzzBov 2010

15
ñパターンには該当しませんが、完全に有効なUTF-8文字です。
オイベク2013

8
/ ^ [a-z0-9] + $ / i.test(TCode)
Alex V

3
正規表現のテストは、よりもはるかに遅いようです(Chrome 36では66%)charCodeAt()以下のjsPerf私の答えを参照してください。
Michael Martin-Smucker 2014

5
この正規表現は、「ą」、「ź」、「ć」など、一部の言語で使用される特殊文字では機能しません。
RafałSwacha

79

アスカーの元の使用傾向str.charCodeAt(i)は、正規表現の選択肢よりも速いようです。でjsPerfに私のテスト正規表現オプションを行い、66%遅いクロム36(及びわずかに遅いのFirefox 31)。

これは、文字列を受け取ってtrueor を返す元の検証コードのクリーンアップバージョンです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行の正規表現は間違いなく見た目がきれいです。ただし、速度に厳密に関心がある場合は、この代替案を検討することをお勧めします。


17
プログラマーはコードの見た目が好きですが、その内面の美しさがわかります。
ジギー2014

興味深い代替アプローチ-私の心を越えたことはありません。私は正規表現だけを念頭に置いてここに来ました!
ozzy432836 2018年

「プログラミング」の意味を理解し、理解させる答え。私は私の答え
Oscar Zarrus

41

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

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

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

ここで^は、文字列の始まりと文字列の$終わりを意味し、[0-9a-z]+from 0から9ORからato までの1つ以上の文字を意味しzます。

Javascript regexenの詳細については、https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressionsを ご覧ください。


14
ユーザーに「マジックストリング」を与えるのではなく、基本的な正規表現を説明し、ガイドにリンクするための+1。
Charles Burns

4
@inor正規表現の末尾に「i」を追加して、大文字と小文字を区別しないように指定できます。つまり/^[a-z0-9]+$/i、これは小文字と大文字の両方をカバーします
LJH

33

一度に1つずつ実行する必要はありません。ただ、あるそのいずれかのテストを行うことではない英数字。見つかった場合、検証は失敗します。

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


6

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

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

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

var TCode = document.getElementById('TCode').value;
return TCode.isAlphaNumeric()


2
DJDavid98:「所有していないオブジェクトを変更しない」というルールはここでは適用されないと思います。Justinは既存の機能を変更するのではなく、Stringの機能を拡張するだけでした。見方としては、C#の世界では、これは拡張メソッドの完全に有効な使用法と見なされます。いつか "String.isAlphaNumeric():boolean"がブラウザの製造元によって実装されても、シグネチャもアクションも実際には変更されないため、この特定の例では保守性の低下は見られません。何かがルールであることは、例外がないことを意味するものではありません。
RistoVälimäki15年

5
    // 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の英数字検証の理解にも役立ちます。


3

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

本当の英数字の文字列は次のようで"0a0a0a0b0c0d"はないよう"000000""qwertyuio"

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

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

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

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

マイケル・マーティン・スマッカーの答えは、照明されています。

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

しかし、それでもマイケル・マーティン・スマッカーの答え輝かしいものでした。私のために。「低レベル」で考えることができ、英数字の文字列を明確に処理する実際の関数を作成できました。私はそれをPHP相対関数のように呼び出しましたctype_alnum編集2020-02-18:ただし、これはORではなくANDをチェックします)。

これがコードです:

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
};

...そして、これがデモです

PHP関数の代わりにJavaScriptを使用する方法を探していたため、このディスカッションに参加しました。「すぐに使える」という答えは見つかりませんでしたが、Stackoverflowでよくあることですが、知識とお互いの比較の概念は崇高なものであり、誰かの答えについて考え、一緒にあなたの解決策を見つけることにつながります探していましたが、あなたはそれを知っているとは思いませんでした。

そしてそれを共有してください!

ベスト

オスカー


上記はalphaNumericではなくalphaAndNumericを解決します。return isNumeric || isAlpha;alphaNumericです。上記はいくつかに役立つかもしれません。
TamusJRoyce

1
もちろん@TamusJRoyce。ただし、VAT番号を確認するための画像。数値の場合と英数字の場合があります。ちなみに、私が気づくのは、私のPHPの欠点ですが、相対PHP関数がANDではなくORを予測していることです。私のPHPアプリケーションのすべてのコードを変更し、ANDに提供されるアドホック関数を作成しなければならなかったため、これは問題です
Oscar Zarrus

3

タイトなループでは、正規表現を避けて文字をハードコードする方がよいでしょう。

const CHARS = new Set("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
function isAlphanumeric(char) {
    return CHARS.has(char);
}

これを説明できますか
lazydeveloper

2
このコードは、ループ内の文字列全体をスキャンする場合はO(N ^ 2)であり、提示された最悪の正規表現ソリューションよりもはるかに悪いパフォーマンスになります(たとえば、ユーザーがすべての 'Z'を渡すと、indexOf()は各文字で終了します)。0からZの文字列全体をスキャンするオーバーヘッド(平均して、呼び出しごとに18文字の比較を実行)だけでなく、ソース文字列の1文字あたり2つの関数呼び出しに相当するオーバーヘッドも発生する可能性があります。コードは、それが使用される場所に応じて、DoSの脆弱性を導入する可能性さえあります。
CubicleSoft

1
あなたは完全に正しいCubicleSoftです。JS Setを使用するように回答を更新しました。
マルガニス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.