2010-12-17 139 views
2

我有尝试检查密码的复杂下面的PHP代码然而,当我运行它,我似乎并没有得到有效的结果(见下文)PHP密码复杂性检查代码

while (odbc_fetch_row($rs)) { 

    $r1='/[A-Z]/'; //Uppercase 
    $r2='/[a-z]/'; //lowercase 
    $r3='/[[email protected]#$%^&*()-_=+{};:,<.>]/'; // whatever you mean by 'special char' 
    $r4='/[0-9]/'; //numbers 


if (!preg_match_all($r4, odbc_result($rs,"U_password"))) { 
    echo "Password doesn't contain numbers: " . odbc_result($rs,"U_Mailbox") . "@" . odbc_result($rs,"U_Domain") . " " . odbc_result($rs,"U_password") . "<br>\n"; 
} 

if (!preg_match_all($r2, odbc_result($rs,"U_password"))) { 
    echo "Password doesn't contain lowercase letters: " . odbc_result($rs,"U_Mailbox") . "@" . odbc_result($rs,"U_Domain") . " " . odbc_result($rs,"U_password") . "<br>\n"; 
} 

if (!preg_match_all($r1, odbc_result($rs,"U_password"))) { 
    echo "Password doesn't contain uppercase letters: " . odbc_result($rs,"U_Mailbox") . "@" . odbc_result($rs,"U_Domain") . " " . odbc_result($rs,"U_password") . "<br>\n"; 
} 

}

输出:

密码不包含小写字母:[email protected] lowercasepw
密码不包含足够的数字:[email protected] 8B_dip + 3
密码不包含大写字母:[email protected] Barrywidg @ t1o

(顺便说一句,上面的密码是不真实的。我只是将小写字母替换为其他小写字母,其他大写字母替换为大写字母,其他数字替换为其他数字。)

所以我很困惑,为什么我的代码不工作。其他人可以帮忙吗?

感谢 布拉德

回答

4
  1. 变化preg_match_allpreg_match
  2. 在您的特殊字符正则表达式中,您有几个不会转义的正则表达式字符。这是esacaped:/[\[email protected]#\$%\^&\*\(\)-_=+\{\};:,<\.>]/

没有保证,这就是虽然问题的100%......

+0

谢谢 - 这似乎是它。 – Brad 2010-12-17 23:44:57

1

preg_match_all接受三个参数,而不是两个:第三个是一个数组,将填充参考与火柴。使用preg_match

此外,确保这些特殊字符如果属于PCRE语法的一部分则会被转义(例如:\.而不是.)。

我建议你增加error_reporting和/或激活display_errors和/或错误记录。如果有的话,这是因为吐出E_WARNING错误而被捕获的东西。

+0

谢谢,我正在检查phperror.log,但也许我没有足够高的测井曲线。 – Brad 2010-12-17 23:45:37

2

后转换你的榜样,以独立代码(请张贴在未来)

我得到这些一堆:

PHP Warning: preg_match_all() expects at least 3 parameters, 2 given in /Users/cabbey/foo.php on line 9

你或许应该打开了错误报告。

我想既然你使用_all,你想算来,在这种情况下,你想改变你的正则表达式的不可贪了。

$r1='/[A-Z]{1}/'; //Uppercase 
$r2='/[a-z]{1}/'; //lowercase 
$r3='/[[email protected]#$%^&*()_=+{};:,<.>-]{1}/'; // whatever you mean by 'special char' 
$r4='/[0-9]{1}/'; //numbers 

$found = array(); 

foreach (array('lowercasepw', '8B_dip+3', '[email protected]') as $pass) { 

    if (!preg_match_all($r4, $pass, $found)) { 
     echo "Password doesn't contain numbers: $pass\n"; 
    } else { 
     echo "found ".count($found[0])." numbers\n"; 
    } 

    if (!preg_match_all($r2,$pass, $found)) { 
     echo "Password doesn't contain lowercase letters: $pass\n"; 
    } else { 
     echo "found ".count($found[0])." lowercase\n"; 
    } 

    if (!preg_match_all($r1, $pass, $found)) { 
     echo "Password doesn't contain uppercase letters: $pass\n"; 
    } else { 
     echo "found ".count($found[0])." uppercase\n"; 
    } 

}