2011-03-09 93 views
1

跟在PHP regular expression to match alpha-numeric strings with some (but not all) punctuation之後,我需要接受至少兩種類型的字符,它們必須是數字,字母或標點符號中的一種,字符串必須介於6和18個字符。這是最好的方式嗎?我使用RegExLib中的模式構造了這個正則表達式。PHP正則表達式:字符串必須包含字符類型

preg_match('@' . 
// one number and one letter 
'^(?=.*\d)(?=.*[a-zA-Z])[!-%\'-?A-~]{6,18}$' . 
// one number and one punctuation 
'|^(?=.*\d)(?=.*[!-%\'-/:-?\[-`{-~])[!-%\'-?A-~]{6,18}$' . 
// or one punctation and one 
'|^(?=.*[!-%\'-/:-?\[-`{-~])(?=.*[a-zA-Z])[!-%\'-?A-~]{6,18}$' . 
'@i', $pass, $matches); 

回答

4

您的解決方案太複雜。只要檢查字符類型和長度的存在。

<?php 
$is_special = preg_match('/[+#!\?]/', $pass); //sample only 
$is_numeric = preg_match('/[0-9]/', $pass); 
$is_char = preg_match('/[a-zA-Z]/', $pass); 

if ($is_special + $is_numeric + $is_char < 2) { 
    //fail 
} 

//+lenght check 
1

這個正則表達式不起作用,因爲如果你喂這三種類型,你會被拒絕。

要建立,因爲你需要考慮的是組合的所有可能性中的一個將是相當冗長:

  1. 字母 - 數字
  2. 數字 - 信
  3. 信 - 標點
  4. 標點符號 - 信
  5. Digit - 標點符號
  6. 標點符號 - 數字
  7. 字母 - 數字 - 標點
  8. 信 - 標點符號 - 數字
  9. 數字 - 字母 - 標點
  10. 數字 - 標點符號 - 信
  11. 標點 - 字母 - 數字
  12. 標點符號 - 數字 - 信

相反,我會建議手動進行:

function isValidString($string) { 
    $count = 0; 
    //Check for the existence of each type of character: 
    if (preg_match('/\d/', $string)) { 
     $count++; 
    } 
    if (preg_match('/[a-z]/i', $string)) { 
     $count++; 
    } 
    if (preg_match('/[!-%\'-\/:-?\[-{-~]/', $string)) 
     $count++; 
    } 
    //Check the whole string 
    $regex = '/^[a-z\d!-%\'-\/:-?\[-{-~]{6,18}$/'; 
    if ($count >= 2 && preg_match($regex, $string)) { 
     return true; 
    } 
    return false; 
} 

這是關於只要你的正則表達式,它更可讀(恕我直言)...

+0

我測試了我的正則表達式所有三種類型,它仍然工作。前視也負責排序。但我看到你的更可讀性和工作。 – nymo

1

erenon的解決方案錯誤地允許空格。 (當它檢​​查長度時,它需要添加一個有效字符的檢查)。 這是我會怎麼做:

if (preg_match('& 
    # Password with 6-18 chars from 2 of 3 types: (digits|letters|punct). 
    ^       # Anchor to string start. 
    (?:       # Non-capture group for alternatives. 
     (?=.*?[0-9])    # Either a digit 
     (?=.*?[a-zA-Z])   # and a letter, 
    | (?=.*?[0-9])    # Or a digit 
     (?=.*?[!-%\'-/:-?[-`{-~]) # and a punctuation, 
    | (?=.*?[!-%\'-/:-?[-`{-~]) # Or a punctuation 
     (?=.*?[a-zA-Z])   # and a letter. 
    )       # End group of alternatives. 
    [!-%\'-?A-~]{6,18}$   # Match between 6 and 18 valid chars. 
    &x', $password)) { 
    // Good password 
} else { 
    // Bad password 
} 

注意,長度標準只需要進行一次檢查。而且,到目前爲止,它可能比其他任何解決方案都要快。

+0

爲什麼空格在密碼中無效? – erenon

+0

用於檢查長度的原始帖子的正則表達式字符類中不包含空格。但你說得對,這個問題的措辭沒有明確說明。 – ridgerunner

1

這是它在一個正則表達式:

/^(?=.*[A-Za-z])(?=.*[0-9])([[email protected]#$%^&*-\[\]])+$/

讓小資金數字和特殊字符 檢查,如果密碼至少包含一個字符和一個數字

相關問題