2010-12-13 9 views
70

¿Puede sugerir la mejor manera de realizar una verificación alfanumérica en un campo ENTRADA en JSP? He adjuntado mi código actual y sé su ninguna parte cerca de perfecto :)La mejor forma de verificación alfanumérica en Javascript

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

+1

Depende de cómo se defina "mejor". La mayoría de las respuestas a continuación sugieren regex, que funciona [mucho más lento que el código original] (http://jsperf.com/alphanumeric-charcode-vs-regexp). He [limpiado tu código] (http://stackoverflow.com/a/25352300/388639) un poco, que en realidad funciona muy bien. –

Respuesta

65

Puede utilizar this regex/^[a-z0-9]+$/i

+3

, por supuesto, esto supone que la cadena vacía ('" "') no debe coincidir. – zzzzBov

+0

Esto es genial :) Regex es dulce – t0mcat

+0

Es bueno, pero ¿qué hay de los caracteres no ASCII? – Oybek

30

No es necesario hacerlo de uno en uno. Haga una prueba para cualquiera que sea no alfanumérico. Si se encuentra uno, la validación falla.

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

Si hay por lo menos un partido de un alfa numérico no, lo hará return false.

26

Compruébelo con una expresión regular.

Javascript regexen no tienen clases de caracteres POSIX, por lo que tiene que escribir manualmente rangos de caracteres:

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

Aquí ^ significa comienzo de cuerda y $ significa final de la cadena, y [0-9a-z]+ significa que uno o más de carácter de 0 a 9 O de a a z.

Más información sobre Javascript regexen aquí: https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

+11

+1 para explicar la expresión regular básica y el enlace a una guía, en lugar de darle al usuario " cuerda mágica ". –

+4

necesita agregar AZ – inor

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

Además, this article también ayuda a comprender JavaScript validación alfanumérica.

5

me gustaría crear un método prototipo de la secuencia:

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

Entonces, el uso sería:

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

[JavaScript no modificable: no modifique objetos que no le pertenecen] (http://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects -you-down-own /) – SeinopSys

+2

DJDavid98: No creo que la regla "no modifique objetos que no le pertenecen" se aplique aquí. Justin simplemente estaba ampliando las capacidades de String, no modificando las funcionalidades existentes. Para la perspectiva, en C# world, eso sería considerado como un uso perfectamente válido de un método de extensión. Incluso si algún día "String.isAlphaNumeric(): boolean" fuera implementado por los fabricantes de navegadores, ni la firma ni la acción cambiarían en realidad, por lo que no puedo ver ninguna reducción de la capacidad de mantenimiento en este ejemplo en particular. Que algo es una regla no implica que no haya excepciones. –

40

inclinación original del autor de la pregunta de utilizar str.charCodeAt(i) parece ser más rápido que la alternativa de expresiones regulares. En my test on jsPerf, la opción RegExp tiene un rendimiento un 66% más lento en Chrome 36 (y un poco más lento en Firefox 31).

Aquí hay una versión limpia en marcha del código de validación original que recibe una cadena y devuelve true o 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; 
}; 

Por supuesto, puede haber otras consideraciones, tales como la legibilidad. Una expresión regular de una línea es definitivamente más bonita de mirar. Pero si está estrictamente preocupado por la velocidad, es posible que desee considerar esta alternativa.

+8

Los programadores adoran el aspecto del código, pero ves su belleza interna. – Ziggy

Cuestiones relacionadas