我有以下PHP代码试图检查密码复杂性但是当我运行它时,我似乎没有得到有效的结果(见下文)
while (odbc_fetch_row($rs)) {
$r1='/[A-Z]/'; //Uppercase
$r2='/[a-z]/'; //lowercase
$r3='/[!@#$%^&*()-_=+{};:,<.>]/'; // 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";
}
}
输出:
密码不包含小写字母:jason@domain.com lowercasepw
密码不包含足够的数字:service@domain.com 8B_dip + 3
密码不包含大写字母:barry@domain.com Barrywidg @ t1o
(顺便说一下上面的密码不是真的。我只是将小写字母替换为其他小写字母,大写字母替换为其他大写字母,以及其他数字的数字。)
所以我很困惑为什么我的代码不起作用。其他人可以帮忙吗?
由于 布拉德
答案 0 :(得分:4)
preg_match_all
更改为preg_match
。/[\!@#\$%\^&\*\(\)-_=+\{\};:,<\.>]/
虽然不能保证这是100%的问题......
答案 1 :(得分: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='/[!@#$%^&*()_=+{};:,<.>-]{1}/'; // whatever you mean by 'special char'
$r4='/[0-9]{1}/'; //numbers
$found = array();
foreach (array('lowercasepw', '8B_dip+3', 'Barrywidg@t1o') 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";
}
}
答案 2 :(得分:1)
preg_match_all
接受三个参数,而不是两个:第三个参数是对将使用匹配填充的数组的引用。使用preg_match
。
另外,如果这些特殊字符属于PCRE语法(例如:\.
而不是.
),请确保对这些特殊字符进行转义。
我建议你增加error_reporting
和/或激活display_errors
和/或错误记录。如果你有,这是因为它吐出E_WARNING错误而被捕获的东西。