2012-10-13 66 views
5

我是很新的正則表達式,我做了一個研究,並得到了一點理解 我需要的是一個符合這些規範用正則表達式安全密碼

  1. 任何字母字符的密碼(至少一個)
  2. 任何數字字符(至少一個)
  3. 沒有空格
  4. 特殊字符(0或更多)

我到是這個

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

它匹配1,2,3種規格什麼而不是4 我嘗試了4種不同的東西,但我失敗了

誰能幫助我?

回答

6

你非常接近。這似乎解決您的問題:

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

我做了兩個更改。

  1. 只需使用i修飾符(匹配大小寫不敏感)稍作縮短即可。這允許移除A-Z`。
  2. (?!\S)在這裏並沒有真正的幫助,我想。相反,您可以簡單地讓您的實際匹配只包含非空格字符(\S+)。這也將立即允許您的密碼中的特殊字符(真正的任何空格rexcept)。

如果您只想允許一組特殊字符,請將\S替換爲包含字母,數字和您想允許的所有字符的字符類。順便說一句,如果你想確保你的密碼有一定的最小長度,你可以將+改爲{8,}

+0

完美的工作,謝謝你,我想+100 :)你但它需要15聲望,我只有8,再次感謝你:) –

+0

還是更快......'/ ^(?= [^ 0-9 ] * [0-9])(?= [^ AZ] * [AZ])(\ S +)$/i' – ridgerunner

0

似乎是這樣的:

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

添加你需要的所有特殊字符。

編輯:回答一些意見,這裏是一個試運行的結果:

<?php 

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

$s = 'A2x.'; 

echo preg_match($re, $s); 

?> 

在Ubuntu下使用CLI測試:

[email protected]$ php _.php 
1 

而且它還有根據01值爲$s;)

+0

該正則表達式永遠無法匹配,因爲它包含兩個行尾字符('$')。 – duskwuff

+0

編輯:測試結果 –

+0

而m.buettner的解決方案是完美的。 Upvoting。 –

1

使用三個單獨的正則表達式 - one to che ck有一個字母字符,一個用來檢查是否有一個數字,另一個用來檢查是否有空格。儘管只用一個正則表達式就可以做到這一點,但每種附加條件都會顯着增加正則表達式的複雜度。

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

不需要奇怪的正則表達式。特別是因爲要確保密碼包含不含,並在它出現不要緊:

<?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您還可以創建一個「閾值」,以確保至少有4個已滿足或有所不同......即不會返回任何一個失敗,請記錄滿足條件的數量。然後回到計數高於必要的閾值。 – jheddings