Disculpe todo, no hay controversia. Pero para que la comunidad crezca como lo ha hecho yo en estos años, es bueno tomar algunas notas.
La cadena alfanumérica real es como "0a0a0a0b0c0d"
y no como "000000"
o "qwertyuio"
.
Todas las respuestas que leí aquí, regresaron true
en ambos casos. Y perdóname, en mi humilde opinión, esto no está bien .
Si quiero comprobar si mi "00000"
cadena es alfanum, mi respuesta "humana" es incuestionablemente FALSA.
¿Por qué? Sencillo. No puedo encontrar ningún carácter de letra. Entonces, es una cadena numérica simple [0-9]
.
Por otro lado, si quisiera verificar mi "abcdefg"
cadena, mi respuesta "humana" es incluso FALSA. No veo números, por lo que no es alfanumérico. Solo alfa [a-zA-Z]
.
La respuesta de Michael Martin-Smucker ha sido esclarecedora.
Sin embargo, su objetivo era lograr un mejor rendimiento en lugar de expresiones regulares. Esto es cierto, usando una forma de bajo nivel hay un mejor desempeño. Pero los resultados son los mismos. Las cadenas "0123456789"
(solo numéricas), "qwertyuiop"
(solo alfabéticas) y "0a1b2c3d4f4g"
(alfanuméricas) regresan TRUE
como alfanuméricas. Misma /^[a-z0-9]+$/i
forma de expresión regular . La razón por la que la expresión regular no funciona es tan simple como obvia. La sintaxis []
indica o , no y . Entonces, si es solo numérico o si es solo letras, regex regresa true
.
Sin embargo, la respuesta de Michael Martin-Smucker fue esclarecedora. Para mi. Me permitió pensar a "bajo nivel", para crear una función real que procese inequívocamente una cadena alfanumérica. Lo llamé como función relativa de PHP ctype_alnum
( editar 2020-02-18: donde, sin embargo, esto verifica O y no Y ).
Aquí está el código:
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
};
... y aquí está la DEMO
Vine a esta discusión porque estaba buscando una alternativa en javascript a la función PHP. No encontré la respuesta "lista para usar", pero como sucede a menudo en Stackoverflow, el concepto de conocimiento y comparación entre sí es algo sublime, que te lleva a pensar en la respuesta de alguien y encontrar juntos la solución que estabas buscando. buscando, pero no pensaste que lo sabías.
¡Y compártelo!
Mejor
Oscar