Scusatemi tutti, nessuna polemica. Ma affinché la comunità cresca come è cresciuta io in questi anni, è bene prendere appunti.
La vera stringa alfanumerica è come "0a0a0a0b0c0d"
e non come "000000"
o "qwertyuio"
.
Tutte le risposte che ho letto qui, sono tornate true
in entrambi i casi. E perdonami, IMHO, questo non è giusto .
Se voglio controllare se la mia "00000"
stringa è alfanum, la mia risposta "umana" è senza dubbio FALSA.
Perché? Semplice. Non riesco a trovare nessuna lettera char. Quindi, è una semplice stringa numerica [0-9]
.
D'altra parte, se volessi controllare la mia "abcdefg"
stringa, la mia risposta "umana" è addirittura FALSA. Non vedo i numeri, quindi non è alfanumerico. Solo alfa [a-zA-Z]
.
La risposta di Michael Martin-Smucker è stata illuminante.
Tuttavia, mirava a ottenere prestazioni migliori invece di regex. Questo è vero, usando un modo di basso livello c'è una performance migliore. Ma i risultati sono gli stessi. Le stringhe "0123456789"
(solo numeriche), "qwertyuiop"
(solo alfa) e "0a1b2c3d4f4g"
(alfanumeriche) restituiscono TRUE
come alfanumeriche. Stesso /^[a-z0-9]+$/i
modo regex . Il motivo per cui la regex non funziona è tanto semplice quanto ovvio. La sintassi []
indica o , non e . Quindi, se è solo numerico o se è solo lettere, regex restituisce true
.
Tuttavia, la risposta di Michael Martin-Smucker è stata comunque illuminante. Per me. Mi ha permesso di pensare a "basso livello", di creare una vera funzione che processa in modo univoco una stringa alfanumerica. L'ho chiamata come funzione relativa di PHP ctype_alnum
( modifica 2020-02-18: dove, tuttavia, questo controlla OR e non AND ).
Ecco il codice:
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
};
... ed ecco la DEMO
Sono arrivato a questa discussione perché cercavo un'alternativa in javascript alla funzione PHP. Non ho trovato la risposta "ready-to-go", ma come spesso accade su Stackoverflow, il concetto di conoscenza e confronto tra loro è qualcosa di sublime, che ti porta a pensare alla risposta di qualcuno e trovare insieme la soluzione che eri cercando, ma non pensavi di saperlo.
E condividilo!
Migliore
Oscar