您能否建议在JSP中对INPUT字段执行字母数字检查的最佳方法?我已附上我当前的代码,我知道它没有接近完美的地方:)
<script type="text/javascript">
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;
}
答案 0 :(得分:85)
您可以使用this regex /^[a-z0-9]+$/i
答案 1 :(得分:59)
提问者最初使用str.charCodeAt(i)
的倾向似乎比正则表达式更快。在my test on jsPerf中,RegExp选项在Chrome 36中执行速度降低66%(在Firefox 31中稍慢)。
这是原始验证代码的清理版本,它接收字符串并返回true
或false
:
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;
};
当然,可能还有其他考虑因素,例如可读性。单行正则表达式看起来绝对更漂亮。但如果您严格关注速度,可能需要考虑这种替代方案。
答案 2 :(得分:32)
您不需要一次只进行一次。只需对不字母数字的任何内容进行测试。如果找到一个,则验证失败。
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
。
答案 3 :(得分:32)
使用正则表达式进行检查。
Javascript regexen没有POSIX字符类,因此您必须手动编写字符范围:
if (!input_string.match(/^[0-9a-z]+$/))
show_error_or_something()
此处^
表示字符串的开头,$
表示字符串的结尾,[0-9a-z]+
表示从0
到9
的字符中的一个或多个或来自a
至z
。
有关Javascript regexen的更多信息,请点击此处: https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions
答案 4 :(得分:7)
我会创建一个String原型方法:
String.prototype.isAlphaNumeric = function() {
var regExp = /^[A-Za-z0-9]+$/;
return (this.match(regExp));
};
然后,用法是:
var TCode = document.getElementById('TCode').value;
return TCode.isAlphaNumeric()
答案 5 :(得分:7)
要匹配所有 Unicode 字母和数字,您可以使用 Unicode 正则表达式:
const alphanumeric = /^[\p{L}\p{N}]+$/u;
const valid = "Jòhn꠵Çoe日本語3rd"; // <- these are all letters or numbers
const invalid = "JohnDoe3rd!";
console.log(valid.match(alphanumeric));
console.log(invalid.match(alphanumeric));
在上面的正则表达式中,u
标志启用 Unicode mode。 \p{L}
是 \p{Letter}
的缩写,\p{N}
是 \p{Number}
的缩写。围绕它们的方括号 []
是一个普通的 character class,这意味着字符必须是字母或数字(在此上下文中)。 +
是“一个或多个”,如果您还想允许空字符串,您可以将其更改为 *
(零个或多个)。^
/$
匹配字符串的开始/结束。
以上内容足以满足大多数情况,但可能比您想要的更多。您可能不想匹配拉丁文、阿拉伯文、西里尔文等。您可能只想匹配拉丁字母和十进制数字。
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
,还匹配 ?
、5
甚至更多。
查看 regex Unicode documentation 了解详细信息,可用的 \p
选项链接在文档页面上。
答案 6 :(得分:5)
// 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);
}
此外,this article还有助于理解JavaScript字母数字验证。
答案 7 :(得分:1)
对不起,没有争议。但是,对于这些年来随着我成长而成长的社区而言,做些笔记是一件好事。
真正的字母数字字符串类似于"0a0a0a0b0c0d"
,而不像"000000"
或"qwertyuio"
。
我在这里阅读的所有答案在两种情况下均返回true
。恕我直言,这不对。
如果我想检查我的"00000"
字符串是否为字母数字,那么我的“人工”答案无疑是FALSE。
为什么?简单。我找不到任何字母char。因此,是一个简单的数字字符串[0-9]
。
另一方面,如果我想检查我的"abcdefg"
字符串,我的“人工”答案甚至为FALSE。我没有看到数字,所以它不是字母数字。只是字母[a-zA-Z]
。
Michael Martin-Smucker's answer一直亮着。
但是他的目标是获得更好的性能,而不是正则表达式。的确如此,使用低级别的方法可以获得更好的性能。但是结果是一样的。
字符串"0123456789"
(仅数字),"qwertyuiop"
(仅字母)和"0a1b2c3d4f4g"
(字母数字)返回TRUE
作为字母数字。正则表达式/^[a-z0-9]+$/i
的方式相同。
正则表达式不起作用的原因很简单。语法[]
表示或,而不是和。
因此,如果仅是数字或,或者仅是字母,则正则表达式将返回true
。
但是,Michael Martin-Smucker's answer仍然具有启发性。为了我。
它使我可以在“低级”上思考,以创建一个明确的真实功能
处理字母数字字符串。我把它称为PHP相对函数ctype_alnum
。
代码如下:
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
};
...这是DEMO
之所以参加此讨论,是因为我正在寻找JavaScript替代PHP函数的方法。我没有找到“准备就绪”的答案,但是正如Stackoverflow上经常发生的那样,知识和彼此比较的概念是一种崇高的思想,使您思考someone's answer并找到一起寻找您想要的解决方案,但您认为自己不知道。
并分享!
最佳
奥斯卡
答案 8 :(得分:1)
如果您想要一个最简单的单线解决方案,则选择使用正则表达式的accepted answer。
但是,如果您想要更快的解决方案,则可以使用以下功能。
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;
}
答案 9 :(得分:0)
要检查input_string是否为字母数字,只需使用:
input_string.match(/[^\w]|_/) == null
答案 10 :(得分:0)
在一个紧凑的循环中,最好避免使用正则表达式并对字符进行硬编码:
function isAlphanumeric(char) {
return "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(char) > -1;
}
答案 11 :(得分:0)
在字母数字验证中删除了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"));
答案 12 :(得分:0)
(/[^0-9a-zA-Z]/.test( "abcdeFGh123456" ));
答案 13 :(得分:0)
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;
};
工作到永恒..