对不起,没有争议。但是,对于这些年来随着我的成长而成长的社区来说,做些笔记是一件好事。
真正的字母数字字符串是like "0a0a0a0b0c0d"
和not like "000000"
或"qwertyuio"
。
我在这里阅读的所有答案true
在两种情况下均返回。恕我直言,这是不对的。
如果我想检查我的"00000"
字符串是否为字母数字,那么我的“人类”答案无疑是假的。
为什么?简单。我找不到任何字母char。因此,是一个简单的数字字符串[0-9]
。
另一方面,如果我想检查我的"abcdefg"
字符串,我的“人为”答案甚至为FALSE。我没有看到数字,所以它不是字母数字。只是阿尔法[a-zA-Z]
。
在迈克尔·马丁-斯马克的答案已经被照亮。
但是,他的目标是获得更好的性能而不是正则表达式。的确如此,使用低级别的方法可以获得更好的性能。但是结果是一样的。字符串"0123456789"
(仅数字),"qwertyuiop"
(仅字母)和"0a1b2c3d4f4g"
(字母数字)TRUE
以字母数字形式返回。同样的正则表达式/^[a-z0-9]+$/i
方式。正则表达式不起作用的原因很简单。语法[]
指示or,而不指示and。因此,如果仅是数字还是仅是字母,则regex返回true
。
但是,Michael Martin-Smucker的答案仍然很有启发性。为了我。它使我可以“低级”思考,创建一个真正的函数,可以明确地处理字母数字字符串。我把它称为PHP相对函数ctype_alnum
(编辑2020-02-18:但是,在此检查OR而不是AND)。
这是代码:
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
};
...这是演示
我之所以参加此讨论,是因为我正在寻找JavaScript替代PHP函数的方法。我没有找到“准备就绪”的答案,但是就像Stackoverflow上经常发生的那样,知识和彼此比较的概念是一种崇高的思想,它使您思考某人的答案并一起找到您曾经的解决方案。寻找,但您不认为自己知道。
分享吧!
最好
奥斯卡奖