Pytanie Najlepszy sposób na sprawdzenie alfanumeryczne w JavaScript


Czy możesz zaproponować najlepszy możliwy sposób wykonania sprawdzania alfanumerycznego pola INPUT w JSP? Dołączyłem mój obecny kod i wiem, że nie jest on bliski perfekcji :)

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


76
2017-12-13 22:23


pochodzenie


Zależy od tego, jak zdefiniujesz "najlepszy". Większość odpowiedzi poniżej sugeruje wyrażenie regularne, które wykonuje znacznie wolniej niż oryginalny kod. Ja oczyścił twój kod trochę, co faktycznie działa bardzo dobrze. - Michael Martin-Smucker


Odpowiedzi:


Możesz użyć to wyrażenie regularne  /^[a-z0-9]+$/i


74
2017-12-13 22:26



oczywiście zakłada to, że pusty ciąg znaków ("") nie powinny być dopasowane. - zzzzBov
ñ nie wchodzi w schemat jednak w pełni poprawny znak w formacie UTF-8. - Oybek
/ ^ [a-z0-9] + $ / i.test (TCode) - Alex V
Testowanie wyrażenia regularnego wydaje się znacznie wolniejsze (66% w Chrome 36) niż charCodeAt(). Widzieć jsPerf i moja odpowiedź poniżej. - Michael Martin-Smucker
To wyrażenie nie działa ze specjalnymi literami znaków używanymi w niektórych językach, np. "Ą", "ź", "ć" itp. - Rafał Swacha


Oryginalna skłonność pytającego do użycia str.charCodeAt(i) wydaje się być szybszy niż alternatywa wyrażenia regularnego. W mój test na jsPerf opcja RegExp działa o 66% wolniej w Chrome 36 (i nieco wolniej w przeglądarce Firefox 31).

Oto oczyszczona wersja oryginalnego kodu walidacyjnego, który odbiera ciąg znaków i zwraca true lub 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;
};

Oczywiście mogą istnieć inne kwestie, takie jak czytelność. Jedno- liniowe wyrażenie regularne jest zdecydowanie ładniejsze. Ale jeśli bardzo zależy Ci na prędkości, możesz rozważyć tę alternatywę.


46
2017-08-17 18:26



Programiści uwielbiają wygląd kodu, ale widzicie jego wewnętrzne piękno. - Ziggy


Nie musisz tego robić po jednym na raz. Po prostu wykonaj test dla każdego, który jest nie alfanumeryczny. Jeśli zostanie znaleziony, sprawdzanie poprawności nie powiedzie się.

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

Jeśli jest co najmniej jedno dopasowanie nie-alfanumerycznego, będzie return false.


30
2017-12-13 22:52





Sprawdź to za pomocą wyrażenia regularnego.

Korektory JavaScript nie mają klas znaków POSIX, więc musisz ręcznie wpisywać zakresy znaków:

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

Tutaj ^ oznacza początek ciągu i $ oznacza koniec napisu, oraz [0-9a-z]+ oznacza jedną lub więcej postaci z 0 do 9 LUB z a do z.

Więcej informacji o regexen JavaScript tutaj: https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions


27
2017-12-28 08:44



+1 za wyjaśnienie podstawowego wyrażenia i powiązania z przewodnikiem, zamiast nadawania użytkownikowi "magicznego ciągu". - Charles Burns
musisz dodać A-Z - inor
@lub możesz po prostu dodać "i" na końcu wyrażenia regularnego, aby określić wielkość liter, .i.e. /^[a-z0-9]+$/i a to obejmie zarówno małe, jak i duże litery - LJH


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

Dalej, Ten artykuł pomaga również zrozumieć walidację alfanumeryczną JavaScript.


5
2017-12-29 04:27





Stworzyłbym prototypową metodę String:

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

Następnie użycie będzie:

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

5
2018-01-04 18:30



Łatwy w obsłudze JavaScript: nie modyfikuj obiektów, które nie są Twoją własnością - SeinopSys
DJDavid98: Nie sądzę, że obowiązuje tutaj zasada "nie modyfikuj obiektów, które nie należą do ciebie". Justin właśnie rozszerzał możliwości String, nie modyfikując istniejących funkcjonalności. Dla perspektywy, w świecie C #, byłoby to uznane za całkowicie poprawne użycie metody rozszerzenia. Nawet jeśli pewnego dnia implementacja "String.isAlphaNumeric (): boolean" zostanie zaimplementowana przez producentów przeglądarek, to ani podpis, ani akcja nie ulegną zmianie, więc nie widzę żadnej redukcji możliwości konserwacji w tym konkretnym przykładzie. To, że coś jest regułą, nie oznacza, że ​​nie ma wyjątków. - Risto Välimäki