2013-02-13 2 views
45

Tôi cố gắng để viết một biểu thức chính quy để xác nhận một mật khẩu mà phải đáp ứng các tiêu chí sau:javascript regex cho mật khẩu có chứa ít nhất 8 ký tự, 1 số, 1 trên và 1 chữ thường

  • Chứa ít nhất 8 nhân vật
  • chứa ít nhất 1 số
  • chứa ít nhất 1 ký tự chữ thường (az)
  • chứa ít nhất 1 ký tự chữ hoa (AZ)
  • chỉ chứa 0-9a-zA-Z

Tôi đã thử cách sau nhưng có vẻ như không hoạt động.

http://jsfiddle.net/many_tentacles/Hzuc9/

<input type='button' value='click' class='buttonClick' /> 
<input type='text' /> 
<div></div> 

và ...

$(".buttonClick").click(function() { 

    if ($("input[type=text]").filter(function() { 
     return this.value.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8})$/); 
    })) { 
     $("div").text("pass"); 
    } else { 
     $("div").text("fail"); 
    } 

}); 

Bất kỳ ý tưởng?

+0

'chỉ chứa 0-9a-zA -Z' là một quy tắc thực sự xấu – Endless

Trả lời

133

biểu hiện thường xuyên của bạn sẽ giống như thế:

/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$/ 

Dưới đây là một lời giải thích:

/^ 
    (?=.*\d)   // should contain at least one digit 
    (?=.*[a-z])  // should contain at least one lower case 
    (?=.*[A-Z])  // should contain at least one upper case 
    [a-zA-Z0-9]{8,} // should contain at least 8 from the mentioned characters 
$/ 
+4

Điều này không làm những gì OP (nhầm lẫn, theo ý kiến ​​của tôi) là yêu cầu. Nó cho phép các ký tự khác ngoài chữ và số. –

+0

Cảm ơn ghi chú, tôi đã sửa nó. –

+1

Làm việc như một sự quyến rũ! http://www.rubular.com/r/jf69EWPQ4N – Henrik

2

Regex của bạn chỉ cho phép chính xác 8 ký tự. Sử dụng {8,} để chỉ định tám hoặc nhiều hơn thay vì {8}.

Nhưng tại sao bạn giới hạn phạm vi ký tự cho phép đối với mật khẩu của mình? Mật khẩu gồm 8 ký tự chữ và số có thể được bruteforced bởi điện thoại của chúng tôi trong vòng vài phút.

2

Ít nhất 8 = {8,}:

str.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8,})$/) 
15

Sử dụng biểu thức thông thường cá nhân để kiểm tra các bộ phận khác nhau sẽ dễ dàng hơn nhiều so với cố gắng để có được một biểu thức chính quy duy nhất để trang trải tất cả trong số họ. Nó cũng giúp dễ dàng thêm hoặc loại bỏ các tiêu chí xác nhận.

Lưu ý rằng việc sử dụng .filter() của bạn không chính xác; nó sẽ luôn trả về một đối tượng jQuery (được xem là sự thật trong JavaScript). Cá nhân, tôi muốn sử dụng vòng lặp .each() để lặp qua tất cả các yếu tố đầu vào và báo cáo trạng thái vượt qua/lỗi riêng lẻ. Một cái gì đó giống như dưới đây:

$(".buttonClick").click(function() { 

    $("input[type=text]").each(function() { 
     var validated = true; 
     if(this.value.length < 8) 
      validated = false; 
     if(!/\d/.test(this.value)) 
      validated = false; 
     if(!/[a-z]/.test(this.value)) 
      validated = false; 
     if(!/[A-Z]/.test(this.value)) 
      validated = false; 
     if(/[^0-9a-zA-Z]/.test(this.value)) 
      validated = false; 
     $('div').text(validated ? "pass" : "fail"); 
     // use DOM traversal to select the correct div for this input above 
    }); 
}); 

Working demo

+1

+1 để sử dụng thử nghiệm. –