Przepraszam wszystkich, bez kontrowersji. Ale żeby społeczność rozwijała się tak, jak mnie rozwijała przez te lata, dobrze jest zrobić kilka notatek.
Prawdziwy ciąg alfanumeryczny jest podobny, "0a0a0a0b0c0d"
a nie podobny "000000"
lub "qwertyuio"
.
Wszystkie odpowiedzi, które tu przeczytałem, true
w obu przypadkach wróciły . I wybacz mi, IMHO, to nie jest w porządku .
Jeśli chcę sprawdzić, czy mój "00000"
ciąg jest alfanumem, moja „ludzka” odpowiedź jest niewątpliwie FAŁSZ.
Czemu? Prosty. Nie mogę znaleźć żadnej litery. Czyli jest prostym ciągiem liczbowym [0-9]
.
Z drugiej strony, gdybym chciał sprawdzić swój "abcdefg"
ciąg, moja „ludzka” odpowiedź jest nawet FAŁSZ. Nie widzę liczb, więc nie są alfanumeryczne. Tylko alfa [a-zA-Z]
.
Odpowiedź Michaela Martina-Smuckera była pouczająca.
Jednak miał na celu osiągnięcie lepszej wydajności zamiast regex. To prawda, używając niskiego poziomu, uzyskuje się lepszą wydajność. Ale wyniki są takie same. Ciągi "0123456789"
(tylko numeryczne), "qwertyuiop"
(tylko alfa) i "0a1b2c3d4f4g"
(alfanumeryczne) są zwracane TRUE
jako alfanumeryczne. Ten sam /^[a-z0-9]+$/i
sposób wyrażenia regularnego . Powód, dla którego wyrażenie regularne nie działa, jest tak prosty, jak oczywisty. Składnia []
wskazuje lub nie i . Zatem, jeśli składa się tylko z liczb lub tylko z liter, zwraca wyrażenie regularne true
.
Jednak odpowiedź Michaela Martina-Smuckera była mimo wszystko pouczająca. Dla mnie. Pozwoliło mi to myśleć „na niskim poziomie”, aby stworzyć prawdziwą funkcję, która w sposób jednoznaczny przetwarza ciąg alfanumeryczny. Nazwałem to funkcją względną PHP ctype_alnum
( edytuj 2020-02-18: Gdzie jednak sprawdza OR, a nie AND ).
Oto kod:
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
};
... a oto DEMO
Przyszedłem do tej dyskusji, ponieważ szukałem alternatywy w javascript do funkcji PHP. Nie mogę znaleźć odpowiedź „ready-to-Go”, ale jak to często bywa na Stackoverflow, pojęcie wiedzy i porównania z siebie jest czymś wzniosłym, że prowadzi cię do myślenia o czyjąś odpowiedź i znaleźć razem rozwiązanie byłaś szukasz, ale nie sądziłeś, że o tym wiesz.
I udostępnij to!
Najlepsza
Oscar