Javascript에서 영숫자 확인하는 가장 좋은 방법


107

INPUT필드에서 영숫자 확인을 수행하는 가장 좋은 방법은 무엇입니까 JSP? 현재 코드를 첨부했습니다.

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


2
"최고"를 정의하는 방법에 따라 다릅니다. 아래 답변의 대부분은 원래 코드보다 훨씬 느리게 수행되는 정규식을 제안 합니다 . 나는 한 코드를 정리 실제로 아주 잘 수행하는 비트.
Michael Martin-Smucker

답변:


100

이 정규식을 사용할 수 있습니다. /^[a-z0-9]+$/i


4
물론 이것은 빈 문자열 ( "")이 일치하지 않아야 한다고 가정합니다 .
zzzzBov 2010

15
ñ패턴에 속하지 않지만 완전히 유효한 UTF-8 문자.
Oybek 2013-04-04

8
/ ^ [a-z0-9] + $ / i.test (TCode)
Alex V

3
정규식 테스트는 .NET보다 훨씬 느린 것 같습니다 (Chrome 36의 경우 66 %) charCodeAt(). 아래 jsPerf내 대답을 참조하십시오 .
Michael Martin-Smucker 2014-08-17

5
이 정규식은 "ą", "ź", "ć"등과 같은 일부 언어에서 사용되는 특수 문자에는 작동하지 않습니다.
Rafał Swacha

79

asker의 원래 사용 성향 str.charCodeAt(i)은 정규 표현식 대안보다 빠릅니다. 에서 jsPerf에 내 테스트 (약간 느린 파이어 폭스 31과) 크롬 36에서 정규 표현식 옵션을 수행하는 66 % 느리게.

다음은 문자열을 수신하고 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;
};

물론 가독성과 같은 다른 고려 사항이있을 수 있습니다. 한 줄로 된 정규식은 확실히보기에 더 예쁘다. 그러나 속도에 엄격하게 관심이 있다면이 대안을 고려할 수 있습니다.


17
프로그래머는 코드 모양을 좋아하지만 내면의 아름다움을 볼 수 있습니다.
저 친구

흥미로운 대안 접근 방식-내 마음을 넘어선 적이 없습니다. 정규식 만 염두에두고 여기에 왔습니다!
ozzy432836

"프로그래밍"이 의미하는 바를 생각하고 이해하게하는 대답입니다. 나는에, 생각의 방법을 사용하는 내 대답
오스카 Zarrus

42

정규식으로 확인하십시오.

Javascript regexen에는 POSIX 문자 클래스가 없으므로 문자 범위를 수동으로 작성해야합니다.

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

여기서는 ^문자열의 시작을 의미하고 문자열의 $끝을 [0-9a-z]+의미하며 0~ 9OR a~ ~ 까지의 문자 중 하나 이상을 의미 합니다 z.

Javascript regexen에 대한 자세한 내용은 https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions를 참조 하십시오.


14
사용자에게 "마법의 문자열"을 제공하는 대신 기본 정규식을 설명하고 가이드에 연결하는 +1.
Charles Burns

4
@inor 당신은 소문자 구분, .IE를 지정하는 정규 표현식의 끝에서 '내가'추가 할 수 있습니다 /^[a-z0-9]+$/i이 모두 낮은과 대문자를 다룰 것
LJH

33

한 번에 하나씩 수행 할 필요가 없습니다. 영숫자 가 아닌 항목에 대해 테스트를 수행하십시오 . 발견되면 유효성 검사가 실패합니다.

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.


6

String 프로토 타입 메서드를 만듭니다.

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

그런 다음 사용법은 다음과 같습니다.

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


2
DJDavid98 : "소유하지 않은 개체를 수정하지 마십시오"라는 규칙이 여기에 적용되지 않는다고 생각합니다. Justin은 기존 기능을 수정하지 않고 String의 기능을 확장했습니다. 관점에서 C # 세계에서는 확장 메서드의 완벽하게 유효한 사용으로 간주됩니다. 언젠가 "String.isAlphaNumeric () : boolean"이 브라우저 제조업체에 의해 구현 되더라도 서명이나 작업이 실제로 변경되지 않으므로이 특정 예제에서 유지 관리 가능성의 감소를 볼 수 없습니다. 무언가가 규칙이라는 것이 예외가 없다는 것을 의미하지는 않습니다.
리스 토 Välimäki

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);
    }

또한 이 기사 는 JavaScript 영숫자 유효성 검사를 이해하는데도 도움 됩니다.


3

실례합니다. 논란이 없습니다. 하지만 최근에 저를 성장시킨 것처럼 커뮤니티가 성장하려면 메모를하는 것이 좋습니다.

실제 영숫자 문자열은 또는 "0a0a0a0b0c0d"같고 같지 않습니다 ."000000""qwertyuio"

여기에서 읽은 모든 답변 true은 두 경우 모두 반환 되었습니다. 그리고 저를 용서하십시오, IMHO, 이것은 옳지 않습니다 .

"00000"문자열이 영숫자 인지 확인하려면 "인간"대답은 의심 할 여지없이 FALSE입니다.

왜? 단순한. 문자 문자를 찾을 수 없습니다. 따라서 간단한 숫자 문자열 [0-9]입니다.

반면에 "abcdefg"문자열 을 확인하려면 "인간적인"대답도 거짓입니다. 숫자가 표시되지 않으므로 영숫자가 아닙니다. 그냥 알파 [a-zA-Z].

마이클 마틴 - Smucker의 대답은 조명하고있다.

그러나 그는 정규식 대신 더 나은 성능을 달성하는 것을 목표로 삼았습니다. 낮은 수준의 방법을 사용하면 더 나은 성능을 얻을 수 있습니다. 그러나 결과는 동일합니다. 문자열 "0123456789"(숫자 만), "qwertyuiop"(알파 만) 및 "0a1b2c3d4f4g"(영숫자)는 TRUE영숫자로 반환 됩니다. 동일한 정규식 /^[a-z0-9]+$/i방식. 정규식이 작동하지 않는 이유는 간단합니다. 구문 []or , not and를 나타냅니다 . 따라서 숫자 만 있거나 문자 만 있으면 정규식은를 반환합니다 true.

단, 마이클 마틴 - Smucker의 대답은 그럼에도 불구하고 조명했다. 나를 위해. 영숫자 문자열을 모호하지 않게 처리하는 실제 함수를 만들기 위해 "낮은 수준"에서 생각할 수있었습니다. 나는 그것을 PHP 상대 함수처럼 불렀다 ctype_alnum( 2020-02-18 편집 : 그러나 이것은 AND가 아닌 OR 확인 ).

코드는 다음과 같습니다.

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

... 그리고 여기에 데모가 있습니다.

나는 자바 스크립트에서 PHP 함수에 대한 대안을 찾고 있었기 때문에이 토론에 왔습니다. "ready-to-go"라는 답을 찾지 못했지만 Stackoverflow에서 자주 발생하는 것처럼 서로에 대한 지식과 비교의 개념은 숭고한 것이므로 다른 사람의 답변 에 대해 생각 하고 함께 해결책을 찾을 수 있습니다 . 찾고 있었지만 당신이 그것을 안다고 생각하지 않았습니다.

그리고 그것을 공유하십시오!

베스트

오스카


위의 방법은 alphaNumeric이 아닌 alphaAndNumeric을 해결합니다. return isNumeric || isAlpha;영숫자입니다. 위의 내용이 도움이 될 수 있습니다.
TamusJRoyce

1
물론 @TamusJRoyce. 그러나 어떤 경우에는 숫자 만 있고 다른 경우에는 영숫자 여야하는 일부 VAT 번호를 확인하는 이미지입니다. 그건 그렇고, 나는 상대 PHP 함수가 AND 대신 OR을 예측한다는 것을 지금 내 잘못 알고 있습니다. 내 PHP 애플리케이션의 모든 코드를 수정하여 AND
Oscar Zarrus

3

타이트한 루프에서는 정규식을 피하고 문자를 하드 코딩하는 것이 좋습니다.

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

이 설명 할 수
lazydeveloper

2
이 코드는 루프의 전체 문자열을 스캔 할 때 O (N ^ 2)이며 제시된 최악의 정규식 솔루션 (예 : 사용자가 모든 'Z'를 전달하면 indexOf ()이 각 문자 끝). 잠재적으로 전체 0-Z 문자열을 스캔하는 오버 헤드 (평균적으로 호출 당 18 자 비교 수행)뿐만 아니라 소스 문자열의 문자 당 오버 헤드 가치가있는 두 개의 함수 호출-다소 중요한 상수 시간 값입니다! 코드는 사용되는 위치에 따라 DoS 취약성을 도입 할 수도 있습니다.
CubicleSoft

1
당신은 절대적으로 CubicleSoft입니다. JS Set을 사용하기 위해 답변을 업데이트했습니다.
Malganis

0

input_string이 영숫자인지 확인하려면 다음을 사용하십시오.

input_string.match(/[^\w]|_/) == null
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.