2011-05-31 68 views
13

我要檢查用戶是否已經成功地滿足了以下要求:強制密碼要求

  • 的密碼至少爲8個字符
  • 由一個資本&一個小寫字母的

我將如何做到這一點?

我使用下面的PHP腳本:

if (strlen($password) < 8) { 
    false 
} else { 
    if (preg_match("/[^0,9]/", $password)) { 
    // how to check the upper case and lower case 
    } 
} 
+3

歡迎的StackOverflow!第一個優秀問題。 – Sampson 2011-05-31 03:58:42

+0

密碼需要有數字嗎? – 2011-05-31 04:28:38

回答

3

使用preg_match("/[A-Z]/")preg_match("/[a-z]/")

0
preg_match('/[a-z]/', $password) && preg_match('/[A-A]/', $password) 
1
if (
    strlen($password) >= 8) && 
    preg_match('/[A-Z]/', $password) > 0 && 
    preg_match('/[a-z]/', $password) > 0) 
{ 
    /* Password validation passes, do stuff. */ 
} 
else { 
    /* Password validation fails, show error. */ 
} 
+0

你不必*包含「> 0」,但由於preg_match返回一個整數而不是布爾值,所以我更願意明確地測試這種情況,以防他們稍後改變它。 – 2011-05-31 04:03:52

2
if(strlen($password) < 8) { 
    return false; 
} 
if(preg_match("/[^0,9]/", $password)) { 
    how to check the upper case and lower case 
} 
if($password == strtoupper($password) || $password == strtolower($password)){ 
//pass fails because its either all upcase, or lowercase 
} 
1

您可以使用trim,這實際上是比正則表達式

更快
if (trim($password, 'a..z') != '' && trim($password, 'A..Z') != '' && strlen($password) >= 8) 
{ 
    /* Password validation passes, do stuff. */ 
} 
else { 
    /* Password validation fails, show error. */ 
} 
+0

即使通行證全部較低且沒有數字,您的第一個個案也會通過。如果密碼中有數字,第二種情況將不會通過 – 2011-05-31 04:13:08

+0

現在即使它沒有數字並且只有大寫和小寫字母,它也會驗證 – 2011-05-31 04:27:53

+0

@Tudor Constantin:OP沒有提及任何有關數字的內容 – 2011-05-31 05:10:46

9

你可以做到這一點與正則表達式:

if (!preg_match('/^(?=[a-z])(?=[A-Z])[a-zA-Z]{8,}$/', $password)) 
{ 
    //error 
} 
2

你可以使用一個密碼排位技術:

$x = "[email protected]#$"; 
$rank = Array(); 


$rank['length'] = strlen($x); 

$matches = Array(); 
preg_match_all("/([a-z]+)/", $x, $matches); 
$rank['lowercase'] = strlen(implode('', $matches[0]))/count($matches[0]); 

$matches = Array(); 
preg_match_all("/([A-Z]+)/", $x, $matches); 
$rank['uppercase'] = strlen(implode('', $matches[0]))/count($matches[0]); 

$matches = Array(); 
preg_match_all("/([0-9]+)/", $x, $matches); 
$rank['numbers'] = strlen(implode('', $matches[0]))/count($matches[0]); 

$matches = Array(); 
preg_match_all("/([^a-zA-Z0-9]+)/", $x, $matches); 
$rank['symbols'] = strlen(implode('', $matches[0]))/count($matches[0]); 


echo "<pre>"; 
var_dump($rank); 
echo "</pre>"; 
+0

當不使用它時,由於'/ count()'函數返回一個除以0的錯誤。任何想法解決這個沒有一堆代碼? – Tarquin 2016-05-04 00:39:08

+0

@Tarquin:爲什麼不簡單地使用if/else?不知道你的意思是「代碼亂碼」 – Quamis 2016-05-04 09:24:07

+0

感謝您的回覆!我很努力地申請if或else,我應該怎樣檢查'$ matches'和'$ matches [0]'都只返回'Array' - 我也嘗試過使用其他一些函數,但是沒有得到結果。 ---我最終調用函數爲'@function_name()'來抑制錯誤,並使用if/else將空變量設置爲0作爲補丁解決方案。 – Tarquin 2016-05-04 23:00:23