在Javascript中进行字母数字检查的最佳方式

时间:2010-12-13 22:23:27

标签: javascript validation

您能否建议在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;     
   }

14 个答案:

答案 0 :(得分:85)

您可以使用this regex /^[a-z0-9]+$/i

答案 1 :(得分:59)

提问者最初使用str.charCodeAt(i)的倾向似乎比正则表达式更快。在my test on jsPerf中,RegExp选项在Chrome 36中执行速度降低66%(在Firefox 31中稍慢)。

这是原始验证代码的清理版本,它接收字符串并返回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;
};

当然,可能还有其他考虑因素,例如可读性。单行正则表达式看起来绝对更漂亮。但如果您严格关注速度,可能需要考虑这种替代方案。

答案 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]+表示从09的字符中的一个或多个或来自az

有关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,还匹配 ? 甚至更多。

查看 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;
};

工作到永恒..