Best way to alphanumeric check in JavaScript

后端 未结 11 2250
逝去的感伤
逝去的感伤 2020-11-28 05:09

What is the best way to perform an alphanumeric check on an INPUT field in JSP? I have attached my current code



        
11条回答
  •  囚心锁ツ
    2020-11-28 05:32

    Here are some notes: The real alphanumeric string is like "0a0a0a0b0c0d" and not like "000000" or "qwertyuio".

    All the answers I read here, returned true in both cases. This is not right.

    If I want to check if my "00000" string is alphanumeric, my intuition is unquestionably FALSE.

    Why? Simple. I cannot find any letter char. So, is a simple numeric string [0-9].

    On the other hand, if I wanted to check my "abcdefg" string, my intuition is still FALSE. I don't see numbers, so it's not alphanumeric. Just alpha [a-zA-Z].

    The Michael Martin-Smucker's answer has been illuminating.

    However he was aimed at achieving better performance instead of regex. This is true, using a low level way there's a better perfomance. But results it's the same. The strings "0123456789" (only numeric), "qwertyuiop" (only alpha) and "0a1b2c3d4f4g" (alphanumeric) returns TRUE as alphanumeric. Same regex /^[a-z0-9]+$/i way. The reason why the regex does not work is as simple as obvious. The syntax [] indicates or, not and. So, if is it only numeric or if is it only letters, regex returns true.

    But, the Michael Martin-Smucker's answer was nevertheless illuminating. For me. It allowed me to think at "low level", to create a real function that unambiguously processes an alphanumeric string. I called it like PHP relative function ctype_alnum (edit 2020-02-18: Where, however, this checks OR and not AND).

    Here's the code:

    
    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
    }
    
    

    And here is a demo:

    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'
            )
            
    })
    
    
    
    
    is Alphanumeric?

    This is an implementation of Michael Martin-Smucker's method in JavaScript.

提交回复
热议问题