2012-10-13 53 views
5

Tôi rất mới để biểu thức chính quy, tôi đã làm một nghiên cứu và có một chút hiểu biết những gì tôi cần là một mật khẩu mà phù hợp với những chi tiết kỹ thuậtmật khẩu bảo đảm với biểu thức chính quy

  1. bất kỳ ký tự chữ (ít nhất một)
  2. bất kỳ ký tự số (ít nhất một)
  3. không có khoảng trống
  4. ký tự đặc biệt (0 trở lên)
.210

những gì tôi đã là này

^(?=.*[0-9])(?=.*[a-zA-Z])([a-zA-Z0-9]+)(?!\S)$ 

mà phù hợp với 1, 2, 3 thông số kỹ thuật nhưng không phải 4 tôi đã cố gắng thứ khác nhau vào ngày 4, nhưng tôi đã thất bại

bất cứ ai có thể giúp tôi?

Trả lời

6

Bạn đang rất gần. Điều này dường như giải quyết được sự cố của bạn:

preg_match("/^(?=.*[0-9])(?=.*[a-z])(\S+)$/i", $password) 

Tôi đã thực hiện hai thay đổi.

  1. Chỉ cần rút ngắn một chút bằng cách sử dụng công cụ sửa đổi i (không phân biệt chữ hoa chữ thường). Điều này cho phép loại bỏ A-Z`.
  2. (?!\S) không thực sự hữu ích ở đây, tôi nghĩ vậy. Thay vào đó, bạn có thể chỉ đơn giản là thực hiện đối sánh thực tế của bạn chỉ bao gồm các ký tự không dấu cách (số \S+). Điều này cũng sẽ ngay lập tức cho phép các ký tự đặc biệt trong mật khẩu của bạn (thực sự là bất kỳ thứ gì được đánh dấu lại cho không gian).

Nếu bạn chỉ muốn cho phép một nhóm ký tự đặc biệt nhất định, hãy thay thế \S bằng một lớp nhân vật có chứa chữ cái, chữ số và tất cả ký tự bạn muốn cho phép. Nhân tiện, nếu bạn muốn đảm bảo mật khẩu của mình có độ dài tối thiểu nhất định, bạn có thể thay đổi ví dụ + thành {8,}.

+0

hoàn hảo công việc, cảm ơn bạn, tôi muốn +100 :) bạn nhưng nó cần 15 danh tiếng và tôi chỉ có 8, cảm ơn bạn một lần nữa :) –

+0

Hoặc nhanh hơn vẫn ... '/^(? = [^ 0-9 ] * [0-9]) (? = [^ Az] * [az]) (\ S +) $/i' – ridgerunner

0

Có vẻ là một cái gì đó như thế này:

^(?=.*[0-9])(?=.*[a-zA-Z])(?=\S*$)(?=[0-9a-zA-Z.,;[email protected]#$%^&*()\-+=\\\]+$) 

Thêm tất cả các ký tự đặc biệt mà bạn cần.

Sửa: trả lời một số ý kiến, đây là kết quả của một thử nghiệm chạy:

<?php 

$re = '/^(?=.*[0-9])(?=.*[A-Z])(?=\S*$)(?=[0-9a-zA-Z.,;[email protected]#$%^&*()\-+=\\\]+$)/'; 

$s = 'A2x.'; 

echo preg_match($re, $s); 

?> 

Thử nghiệm với CLI dưới Ubuntu:

[email protected]$ php _.php 
1 

Và nó được 0 hoặc 1 tùy thuộc vào giá trị của $s;)

+0

Regex đó không bao giờ có thể được so khớp, vì nó chứa hai ký tự cuối dòng ('$'). – duskwuff

+0

Đã chỉnh sửa: kết quả kiểm tra –

+0

Và giải pháp của m.buettner là hoàn hảo. Upvoting. –

1

Sử dụng ba regexes riêng biệt - một để che ck rằng có một ký tự chữ cái, một để kiểm tra rằng có một chữ số, và một để kiểm tra rằng không có không gian. Mặc dù có thể thực hiện tất cả điều này với một regex đơn, mỗi điều kiện bổ sung làm tăng đáng kể độ phức tạp của regex.

preg_match("/[a-z]/i", $passwd) && preg_match("/[0-9]/", $passwd) && !preg_match("/ /", $passwd) 
3

Không cần biểu thức chính quy kỳ lạ. Đặc biệt kể từ khi bạn muốn chắc chắn rằng mật khẩu chứa hoặc không chứa, và nó không quan trọng, nơi nó xuất hiện:

<?php 

/** 
* Validates the password: 
* * Has at least one alphabet character 
* * Has at least one digit 
* * Has no spaces 
* 
* @param string $password Password to validate 
* 
* @return bool    Whether $password is valid or not. 
*/ 
function validate_password($password) { 
    //If no alphabet characters found, return false. 
    if (!preg_match("/[a-z]/i", $password)) { 
     return false; 
    } 
    //If no digits found, return false. 
    if (!preg_match("/[0-9]/", $password)) { 
     return false; 
    } 
    //If a space is found, return false. 
    if (strpos($password, " ") !== false) { 
     return false; 
    } 
    //Special characters are optional, so no checking. 
    //If nothing happened so far, the password is valid. Return true. 
    return true; 
} 

var_dump(
    validate_password("test"),   //False, no digits 
    validate_password("test123 test"), //False, space 
    validate_password("123456"),  //False, no alphabet 
    validate_password("test1234")  //True 
); 
+0

+1 Bạn cũng có thể tạo "ngưỡng" để đảm bảo rằng ít nhất 3 trong số 4 đã được thỏa mãn hoặc điều gì đó ... tức là thay vì trả lại cho bất kỳ lỗi nào, hãy đếm số lượng điều kiện được đáp ứng. Sau đó, trả lại số lượng vượt quá ngưỡng cần thiết. – jheddings

Các vấn đề liên quan