2014-04-08 82 views
0

我想驗證輸入的密碼如下使用preg_math功能我複雜性和長度的規則:驗證密碼如下的複雜性和長度規則

if (!preg_match('/(?=.*[A-Za-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])/', $password)) { 
    $errors[] = 'Password allows alpha-numerical sumbols and should contain number and letters between 6-24 symbols'; 
} 

但是這個功能不能正常工作。因爲我的密碼應該包含至少一個數字(0-9)和一個字母(a-z)符號(,), - 在6和20個符號之間。

如何寫我的正則表達式? 謝謝!

+2

寫它作爲三個獨立的測試;一個測試長度,一個測試一個數字,一個測試字母和符號。比把它們塞進一個正則表達式要好得多。 – deceze

+0

儘管檢查最小長度是明智的,但我會在沒有其他測試的情況下進行測試。他們只縮小搜索範圍,並且惹惱用戶,以便他們選擇較弱的密碼(如'password2014')。 – martinstoeckli

回答

0

您正在比較整個字符串。
使用strpos:http://php.net/manual/en/function.strpos.php

$password = "test!"; 
//Enter characters you want to check for 
$characters = "/(!?=.*[A-Za-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9])/"; 
//Split into array to check each character 
$chars = str_split($characters); 

//Set wrong password by default and check for correct characters 
$correctPassword = false; 

//Check each character 
foreach($chars as $char){ 
    //If characters have been found, set password as correct 
    if (strpos($password, $char)) 
    { 
     $correctPassword = true; 
    } 
} 

//Also check for length, equal or greater then 6, smaller or equal to 20 
if (($correctPassword) && (strlen($password) >= 6) && (strlen($password) <= 20)) 
{ 
    echo "OK"; 
} 
else 
{ 
    echo "Password Unsafe"; 
} 

希望這有助於:)
如果這是回答你的搜索,請標記爲答案。

0

您需要添加錨和限制字符的數量,這裏是一個方法來完成這項工作:

preg_match('/^(?=.*[A-Za-z])(?=.*[0-9])(?=.*[^a-zA-Z0-9]).{6,20}$/', $password)