Com licença, sem polêmica. Mas para que a comunidade cresça como eu cresci nesses anos, é bom fazer algumas anotações.
A string alfanumérica real é semelhante "0a0a0a0b0c0d"
e não semelhante "000000"
ou "qwertyuio"
.
Todas as respostas que li aqui, retornaram true
em ambos os casos. E me perdoe, IMHO, isso não está certo .
Se eu quiser verificar se minha "00000"
string é alphanum, minha resposta "humana" é inquestionavelmente FALSE.
Por quê? Simples. Não consigo encontrar nenhuma letra char. Portanto, é uma string numérica simples [0-9]
.
Por outro lado, se eu quisesse verificar minha "abcdefg"
string, minha resposta "humana" seria até FALSA. Não vejo números, portanto não é alfanumérico. Apenas alfa [a-zA-Z]
.
A resposta de Michael Martin-Smucker foi esclarecedora.
No entanto, seu objetivo era alcançar um melhor desempenho em vez de regex. Isso é verdade, usando uma forma de baixo nível há um melhor desempenho. Mas os resultados são os mesmos. As strings "0123456789"
(apenas numéricas), "qwertyuiop"
(apenas alfa) e "0a1b2c3d4f4g"
(alfanumérico) são retornadas TRUE
como alfanuméricas. Da mesma /^[a-z0-9]+$/i
maneira regex . A razão pela qual a regex não funciona é tão simples quanto óbvia. A sintaxe []
indica ou , não e . Portanto, se for apenas numérico ou se for apenas letras, o regex retorna true
.
Mas a resposta de Michael Martin-Smucker foi esclarecedora. Para mim. Isso me permitiu pensar em "baixo nível", para criar uma função real que processa inequivocamente uma string alfanumérica. Eu chamei de função relativa do PHP ctype_alnum
( editar 2020-02-18: onde, entretanto, isso verifica OR e não AND ).
Aqui está o 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
};
... e aqui está o DEMO
Cheguei a esta discussão porque estava procurando uma alternativa em javascript para a função PHP. Não achei a resposta "pronto para ir", mas como costuma acontecer no Stackoverflow, o conceito de conhecimento e comparação entre si é algo sublime, que te leva a pensar na resposta de alguém e encontrar juntos a solução que você estava procurando, mas você acha que não sabia disso.
E compartilhe!
Melhor
Oscar