JavaScript 中字母数字检查的最佳方法

JSP中的 INPUT字段执行字母数字检查的最佳方法是什么?我附上了我现在的代码

function validateCode() {
var TCode = document.getElementById("TCode").value;


for (var i = 0; i < TCode.length; i++) {
var char1 = TCode.charAt(i);
var cc = char1.charCodeAt(0);


if ((cc > 47 && cc < 58) || (cc > 64 && cc < 91) || (cc > 96 && cc < 123)) {
} else {
alert("Input is not alphanumeric");
return false;
}
}


return true;
}


387940 次浏览

您可以使用 这个正则表达式 /^[a-z0-9]+$/i

你不需要一次只做一件事。只要做一个测试,任何是 没有字母数字。如果找到一个,则验证失败。

function validateCode(){
var TCode = document.getElementById('TCode').value;
if( /[^a-zA-Z0-9]/.test( TCode ) ) {
alert('Input is not alphanumeric');
return false;
}
return true;
}

如果至少有一个非字母数字的匹配,它将 return false

用正则表达式检查。

Javascript regexen 没有 POSIX 字符类,因此必须手动编写字符范围:

if (!input_string.match(/^[0-9a-z]+$/))
show_error_or_something()

这里 ^表示字符串的开头,$表示字符串的结尾,而 [0-9a-z]+表示从 09或从 az的一个或多个字符。

更多关于 Javascript regexen 的信息请点击这里: Https://developer.mozilla.org/en/javascript/guide/regular_expressions

    // On keypress event call the following method
function AlphaNumCheck(e) {
var charCode = (e.which) ? e.which : e.keyCode;
if (charCode == 8) return true;


var keynum;
var keychar;
var charcheck = /[a-zA-Z0-9]/;
if (window.event) // IE
{
keynum = e.keyCode;
}
else {
if (e.which) // Netscape/Firefox/Opera
{
keynum = e.which;
}
else return true;
}


keychar = String.fromCharCode(keynum);
return charcheck.test(keychar);
}

此外,这篇文章还有助于理解 JavaScript 字母数字验证。

我将创建一个 String 原型方法:

String.prototype.isAlphaNumeric = function() {
var regExp = /^[A-Za-z0-9]+$/;
return (this.match(regExp));
};

那么,用法是:

var TCode = document.getElementById('TCode').value;
return TCode.isAlphaNumeric()

询问者最初使用 str.charCodeAt(i)的倾向似乎比正则表达式的替代方法更快。在 我对 jsPerf 的测试中,RegExp 选项在 Chrome36中的执行速度要慢66% (在 Firefox31中稍慢)。

下面是原始验证代码的一个清理版本,它接收一个字符串并返回 truefalse:

function isAlphaNumeric(str) {
var code, i, len;


for (i = 0, len = str.length; i < len; i++) {
code = str.charCodeAt(i);
if (!(code > 47 && code < 58) && // numeric (0-9)
!(code > 64 && code < 91) && // upper alpha (A-Z)
!(code > 96 && code < 123)) { // lower alpha (a-z)
return false;
}
}
return true;
};

当然,可能还有其他考虑因素,比如可读性。一行正则表达式肯定更好看。但是如果你严格关注速度,你可能会考虑这个替代方案。

下面是一些注意事项: 真正的字母数字字符串类似于 "0a0a0a0b0c0d",而不像 "000000""qwertyuio"

我在这里读到的所有答案,在两种情况下都返回了 true

如果我想检查我的 "00000"字符串是否是字母数字,我的直觉毫无疑问是错误的。

为什么? 很简单。我找不到任何字母字符。所以,是一个简单的数字字符串 [0-9]

另一方面,如果我想检查我的 "abcdefg"字符串,我的直觉 还是假的,我没看到数字,所以不是字母数字,只是字母 [a-zA-Z]

Michael Martin-Smucker 的回答一直很有启发性。

然而,他的目标是实现更好的性能,而不是正则表达式。这是真的,使用低水平的方式有一个更好的性能。但结果是一样的。 字符串 "0123456789"(只有数字)、 "qwertyuiop"(只有 alpha)和 "0a1b2c3d4f4g"(字母数字)返回 TRUE为字母数字。 正则表达式不起作用的原因很简单,很明显。语法 []表示 或者,而不是 还有。 因此,如果它只是数字 或者,如果它只是字母,那么正则表达式返回 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
}


这是一个演示:

function ctype_alnum(str) {
var code, i, len;
var isNumeric = false, isAlpha = false; //I assume that it is all non-alphanumeric


    

loop1:
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
};


$("#input").on("keyup", function(){


if ($(this).val().length === 0) {$("#results").html(""); return false};
var isAlphaNumeric = ctype_alnum ($(this).val());
$("#results").html(
(isAlphaNumeric) ? 'Yes' : 'No'
)
        

})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="input">


<div> is Alphanumeric?
<span id="results"></span>
</div>

这是用 JavaScript 实现的 Michael Martin-Smucker 的方法

要检查 input _ string 是否为字母数字,只需使用:

input_string.match(/[^\w]|_/) == null

在一个紧凑的循环中,最好避免使用正则表达式和硬编码字符:

const CHARS = new Set("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
function isAlphanumeric(char) {
return CHARS.has(char);
}

如果您想要一个最简单的一行程序解决方案,那么使用使用正则表达式的 接受的答案

然而,如果你想要一个更快的解决方案,那么这里有一个函数你可以拥有。

console.log(isAlphaNumeric('a')); // true
console.log(isAlphaNumericString('HelloWorld96')); // true
console.log(isAlphaNumericString('Hello World!')); // false


/**
* Function to check if a character is alpha-numeric.
*
* @param {string} c
* @return {boolean}
*/
function isAlphaNumeric(c) {
const CHAR_CODE_A = 65;
const CHAR_CODE_Z = 90;
const CHAR_CODE_AS = 97;
const CHAR_CODE_ZS = 122;
const CHAR_CODE_0 = 48;
const CHAR_CODE_9 = 57;


let code = c.charCodeAt(0);


if (
(code >= CHAR_CODE_A && code <= CHAR_CODE_Z) ||
(code >= CHAR_CODE_AS && code <= CHAR_CODE_ZS) ||
(code >= CHAR_CODE_0 && code <= CHAR_CODE_9)
) {
return true;
}


return false;
}


/**
* Function to check if a string is fully alpha-numeric.
*
* @param {string} s
* @returns {boolean}
*/
function isAlphaNumericString(s) {
for (let i = 0; i < s.length; i++) {
if (!isAlphaNumeric(s[i])) {
return false;
}
}


return true;
}

在字母数字验证中删除了 NOT 操作。将变量移动到块级作用域。这里那里的一些评论。来源于最好的 Micheal

function isAlphaNumeric ( str ) {


/* Iterating character by character to get ASCII code for each character */
for ( let i = 0, len = str.length, code = 0; i < len; ++i ) {


/* Collecting charCode from i index value in a string */
code = str.charCodeAt( i );


/* Validating charCode falls into anyone category */
if (
( code > 47 && code < 58) // numeric (0-9)
|| ( code > 64 && code < 91) // upper alpha (A-Z)
|| ( code > 96 && code < 123 ) // lower alpha (a-z)
) {
continue;
}


/* If nothing satisfies then returning false */
return false
}


/* After validating all the characters and we returning success message*/
return true;
};


console.log(isAlphaNumeric("oye"));
console.log(isAlphaNumeric("oye123"));
console.log(isAlphaNumeric("oye%123"));

要匹配所有 Unicode 字母和数字,可以使用 Unicode 正则表达式:

const alphanumeric = /^[\p{L}\p{N}]*$/u;


const valid   = "Jòhn꠵Çoe日本語3rd"; // <- these are all letters and numbers
const invalid = "JohnDoe3rd!";


console.log(valid.match(alphanumeric));
console.log(invalid.match(alphanumeric));

在上面的正则表达式中,u标志启用 \p{L}0。\p{L}\p{Letter}的简称,\p{N}\p{Number}的简称。它们周围的方括号 []是一个正常的 \p{L}1,这意味着字符必须是字母或数字(在本文中)。*是“零或更多”,如果不想允许空字符串,可以将其改为 +(一个或多个)。^/$匹配字符串的开始/结束。


以上内容可以满足大多数情况,但可能比您想要的更匹配。你可能不想匹配拉丁语、阿拉伯语、西里尔等。您可能只想匹配拉丁字母和十进制数。

const alphanumeric = /^[\p{sc=Latn}\p{Nd}]*$/u;


const valid   = "JòhnÇoe3rd";
const invalid = "Jòhn꠵Çoe日本語3rd";


console.log(valid.match(alphanumeric));
console.log(invalid.match(alphanumeric));

\p{sc=Latn}\p{Script=Latin}的简称。\p{Nd}\p{Decimal_Number}的简称,与小数匹配。与 \d不同的是,\p{Nd}不仅匹配 5,而且还匹配 𝟓,甚至可能更多。

有关详细信息,请查看 正则表达式 Unicode 文档,可用的 \p选项在文档页面上链接。

请注意,u标志是 没有 Internet Explorer 的支持

(/[^0-9a-zA-Z]/.test( "abcdeFGh123456" ));
const isAlphaNumeric = (str) => {


let n1 = false,
n2 = false;
const myBigBrainString =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
const myHackyNumbers = "0123456789";


for (let i = 0; i < str.length; i++) {
if (myBigBrainString.indexOf(str.charAt(i)) >= 0) {
n1 = true;
}
if (myHackyNumbers.indexOf(str.charAt(i)) >= 0) {
n2 = true;
}


if (n1 && n2) {
return true;
}
}


return n1 && n2;
};

直到永远。

string转换为字母数字(如果文件名称为 Usefull)

function stringToAlphanumeric(str = ``) {
return str
.split('')
.map((e) => (/^[a-z0-9]+$/i.test(e) ? e : '_'))
.join('')
}


const fileName = stringToAlphanumeric(`correct-('"é'è-///*$##~~*\\\"filename`)
console.log(fileName)
// expected  output "correct_filename"