Cách tốt nhất để kiểm tra chữ và số trong Javascript


107

Cách tốt nhất để thực hiện kiểm tra chữ và số trên một INPUTtrường là JSPgì? Tôi đã đính kèm mã hiện tại của mình

<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
Phụ thuộc vào cách bạn định nghĩa "tốt nhất". Hầu hết các câu trả lời bên dưới đề xuất regex, hoạt động chậm hơn nhiều so với mã gốc của bạn . Tôi đã xóa mã của bạn một chút, này thực sự hoạt động rất tốt.
Michael Martin-Smucker

Câu trả lời:


100

Bạn có thể sử dụng regex này /^[a-z0-9]+$/i


4
tất nhiên điều này giả định rằng chuỗi rỗng ( "") không nên được so khớp.
zzzzBov

15
ñkhông thuộc mẫu nhưng ký tự UTF-8 hoàn toàn hợp lệ.
Oybek

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

3
Kiểm tra biểu thức chính quy có vẻ chậm hơn nhiều (66% trong Chrome 36) so với charCodeAt(). Xem jsPerfcâu trả lời của tôi bên dưới .
Michael Martin-Smucker

5
Regex này không làm việc với chữ ký tự đặc biệt được sử dụng trong một số ngôn ngữ, như "a", "Z", "c" vv
Rafał Swacha

79

Xu hướng sử dụng ban đầu của người hỏi str.charCodeAt(i)dường như nhanh hơn so với thay thế cụm từ thông dụng. Trong thử nghiệm của tôi trên jsPerf , tùy chọn RegExp hoạt động chậm hơn 66% trong Chrome 36 (và chậm hơn một chút trong Firefox 31).

Đây là phiên bản được làm sạch của mã xác thực ban đầu nhận một chuỗi và trả về truehoặc 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;
};

Tất nhiên, có thể có những cân nhắc khác, chẳng hạn như khả năng đọc. Biểu thức chính quy một dòng chắc chắn trông đẹp hơn. Nhưng nếu bạn thực sự quan tâm đến tốc độ, bạn có thể muốn xem xét thay thế này.


17
Các lập trình viên thích giao diện của mã, nhưng bạn nhìn thấy vẻ đẹp bên trong của nó.
Ziggy

Cách tiếp cận thay thế thú vị - thậm chí chưa bao giờ vượt qua tâm trí tôi. Tôi đến đây với tâm trí chỉ có regex!
ozzy432836

Câu trả lời khiến bạn phải suy nghĩ và khiến bạn hiểu "lập trình" nghĩa là gì. Tôi sử dụng cách suy nghĩ của bạn, trong câu trả lời của tôi
Oscar Zarrus

42

Kiểm tra nó bằng regex.

Javascript regexen không có các lớp ký tự POSIX, vì vậy bạn phải viết các phạm vi ký tự theo cách thủ công:

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

Ở đây ^có nghĩa là bắt đầu chuỗi và $có nghĩa là kết thúc chuỗi, và [0-9a-z]+có nghĩa là một hoặc nhiều ký tự từ 0đến 9HOẶC từ ađến z.

Thông tin thêm về Javascript regexen tại đây: https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions


14
+1 để giải thích regex cơ bản và liên kết đến một hướng dẫn, thay vì cung cấp cho người dùng một "chuỗi ma thuật".
Charles Burns,

4
@inor, bạn có thể chỉ cần thêm 'i' vào cuối regex để chỉ định phân biệt chữ hoa chữ thường, .ie /^[a-z0-9]+$/ivà điều này sẽ bao gồm cả chữ thường và chữ hoa
LJH 26/07/18

33

Bạn không cần phải làm điều đó một lúc. Chỉ cần thực hiện một bài kiểm tra bất kỳ không phải là chữ và số. Nếu một trong những được tìm thấy, xác nhận không thành công.

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

Nếu có ít nhất một kết quả phù hợp không phải là chữ số, thì nó sẽ phù hợp return false.


6

Tôi sẽ tạo một phương thức nguyên mẫu chuỗi:

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

Sau đó, cách sử dụng sẽ là:

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


2
DJDavid98: Tôi không nghĩ rằng quy tắc "không sửa đổi các đối tượng mà bạn không sở hữu" áp dụng ở đây. Justin chỉ mở rộng các khả năng của String, không sửa đổi các chức năng hiện có. Đối với quan điểm, trong thế giới C #, đó sẽ được coi là cách sử dụng hoàn toàn hợp lệ của một phương thức mở rộng. Ngay cả khi một ngày nào đó "String.isAlphaNumeric (): boolean" sẽ được các nhà sản xuất trình duyệt triển khai, thì chữ ký và hành động cũng không thay đổi thực tế, vì vậy tôi không thể thấy bất kỳ sự giảm thiểu nào về khả năng bảo trì trong ví dụ cụ thể này. Điều gì đó là một quy tắc không có nghĩa là không có ngoại lệ.
Risto 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);
    }

Hơn nữa, bài viết này cũng giúp hiểu xác thực chữ và số JavaScript.


3

Xin lỗi tất cả, không bàn cãi. Nhưng để cộng đồng phát triển như tôi đã phát triển trong những năm này, tốt hơn hết là bạn nên ghi một số ghi chú.

Chuỗi chữ và số thực giống "0a0a0a0b0c0d"và không giống "000000"hoặc "qwertyuio".

Tất cả các câu trả lời tôi đọc ở đây, được trả lại truetrong cả hai trường hợp. Và tha thứ cho tôi, IMHO, điều này không đúng .

Nếu tôi muốn kiểm tra xem "00000"chuỗi của mình có phải là alphanum hay không, câu trả lời "con người" của tôi chắc chắn là FALSE.

Tại sao? Đơn giản. Tôi không thể tìm thấy bất kỳ ký tự ký tự nào. Vì vậy, là một chuỗi số đơn giản [0-9].

Mặt khác, nếu tôi muốn kiểm tra "abcdefg"chuỗi của mình, câu trả lời "con người" của tôi thậm chí là FALSE. Tôi không thấy số, vì vậy nó không phải là chữ và số. Chỉ là alpha [a-zA-Z].

Các câu trả lời Michael Martin-Smucker của đã được sáng tỏ.

Tuy nhiên, anh ấy nhắm đến việc đạt được hiệu suất tốt hơn thay vì regex. Điều này đúng, sử dụng cách cấp thấp sẽ có hiệu suất tốt hơn. Nhưng kết quả là như nhau. Các chuỗi "0123456789"(chỉ số), "qwertyuiop"(chỉ alpha) và "0a1b2c3d4f4g"(chữ và số) trả về TRUEdưới dạng chữ và số. Cùng một /^[a-z0-9]+$/icách regex . Lý do tại sao regex không hoạt động rất đơn giản. Cú pháp []cho biết hoặc , không . Vì vậy, nếu nó chỉ là số hoặc nếu nó chỉ là các chữ cái, thì trả về regex true.

Nhưng, câu trả lời của Michael Martin-Smucker vẫn làm sáng tỏ. Cho tôi. Nó cho phép tôi suy nghĩ ở "cấp độ thấp", để tạo ra một hàm thực sự xử lý rõ ràng một chuỗi chữ và số. Tôi đã gọi nó giống như hàm tương đối trong PHP ctype_alnum( chỉnh sửa 2020-02-18: Tuy nhiên, ở đâu, hàm này kiểm tra HOẶC chứ không phải VÀ ).

Đây là mã:

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

... và đây là DEMO

Tôi đến với cuộc thảo luận này vì tôi đang tìm kiếm một giải pháp thay thế trong javascript cho hàm PHP. Tôi không tìm thấy câu trả lời là "sẵn sàng để thực hiện", nhưng như thường lệ xảy ra trên Stackoverflow, khái niệm kiến ​​thức và sự so sánh với nhau là một điều gì đó cao siêu, khiến bạn phải suy nghĩ về câu trả lời của ai đócùng nhau tìm ra giải pháp cho chính bạn. đang tìm kiếm, nhưng bạn không nghĩ rằng bạn biết điều đó.

Và chia sẻ nó!

Tốt

Oscar


Ở trên giải quyết alphaAndNumeric, không phải alphaNumeric. return isNumeric || isAlpha;là alphaNumeric. Những điều trên có thể hữu ích với một số bạn.
TamusJRoyce

1
@TamusJRoyce tất nhiên. Nhưng hình ảnh để kiểm tra một số số VAT, trong đó một số trường hợp chỉ là số và trong trường hợp khác phải là chữ và số. Nhân tiện, tôi chỉ nhận ra bây giờ, lỗi của tôi, rằng hàm PHP tương đối dự đoán OR thay vì AND. Đó là sự cố vì tôi đã phải sửa đổi tất cả các mã của các ứng dụng PHP của mình, tạo một hàm đặc biệt được cung cấp cho AND
Oscar Zarrus

3

Trong một vòng lặp chặt chẽ, có lẽ tốt hơn là tránh regex và mã hóa các ký tự của bạn:

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

bạn có thể giải thích điều này không
lazydeveloper

2
Mã này là O (N ^ 2) khi quét toàn bộ chuỗi trong một vòng lặp và sẽ dẫn đến hiệu suất kém hơn nhiều so với các giải pháp regex tồi tệ nhất được trình bày (ví dụ: người dùng chuyển tất cả 'Z, indexOf () phải quét đến kết thúc cho mỗi ký tự). Nó không chỉ có khả năng phát sinh chi phí quét toàn bộ chuỗi 0-Z (thực hiện trung bình 18 ký tự so sánh mỗi lần gọi) mà còn có hai lệnh gọi hàm có giá trị tổng chi phí trên mỗi ký tự của chuỗi nguồn - một giá trị thời gian không đổi khá quan trọng! Mã thậm chí có thể tạo ra một lỗ hổng DoS tùy thuộc vào nơi nó được sử dụng.
CubicleSoft

1
Bạn hoàn toàn đúng CubicleSoft. Tôi đã cập nhật câu trả lời để sử dụng JS Set.
Malganis

0

Để kiểm tra xem input_string có phải là chữ và số hay không, chỉ cần sử dụng:

input_string.match(/[^\w]|_/) == null
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.