Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP密码复杂性检查器代码不工作_Php_Passwords_Complexity Theory - Fatal编程技术网

PHP密码复杂性检查器代码不工作

PHP密码复杂性检查器代码不工作,php,passwords,complexity-theory,Php,Passwords,Complexity Theory,我有下面的PHP代码,它试图检查密码的复杂性,但是当我运行它时,我似乎没有得到有效的结果(见下文) while(odbc获取行($rs)){ $r1='/[A-Z]/';//大写 $r2='/[a-z]/';//小写 $r3='/[!@$%^&*()-\=+{};:,]/'//不管你说的“特殊字符”是什么意思 $r4='/[0-9]/';//数字 如果(!preg_match_all($r4,odbc_结果($rs,“U_密码”)){ echo“密码不包含数字:”.odbc\U结果($rs,“U

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

while(odbc获取行($rs)){
$r1='/[A-Z]/';//大写
$r2='/[a-z]/';//小写
$r3='/[!@$%^&*()-\=+{};:,]/'//不管你说的“特殊字符”是什么意思
$r4='/[0-9]/';//数字
如果(!preg_match_all($r4,odbc_结果($rs,“U_密码”)){
echo“密码不包含数字:”.odbc\U结果($rs,“U\U邮箱”)。“@”.odbc\U结果($rs,“U\U域”)。“.odbc\U结果($rs,“U\U密码”)。“
\n”; } 如果(!preg_match_all($r2,odbc_结果($rs,“U_密码”)){ echo“密码不包含小写字母:“.odbc\U结果($rs,“U\U邮箱”)。@”.odbc\U结果($rs,“U\U域”)。“.odbc\U结果($rs,“U\U密码”)。”
\n; } 如果(!preg_match_all($r1,odbc_结果($rs,“U_密码”)){ echo“密码不包含大写字母:”.odbc\U结果($rs,“U\U邮箱”)。“@”.odbc\U结果($rs,“U\U域”)。“.odbc\U结果($rs,“U\U密码”)。”
\n; }
}

输出:

密码不包含小写字母:jason@domain.com小写字母EPW
密码中没有足够的数字:service@domain.com8B_倾角+3
密码不包含大写字母:barry@domain.com Barrywidg@t1o

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

所以我很困惑为什么我的代码不起作用。还有谁能帮忙吗

谢谢 布拉德

  • preg\u match\u all
    更改为
    preg\u match
  • 在特殊字符正则表达式中,有几个未转义的正则表达式字符。这里是escaped:
    /[\!@\$%\^&*\(\)-\=+\{\};:,]/

  • 虽然…

    preg\u match\u all
    接受三个参数,而不是两个:第三个参数是对将填充匹配项的数组的引用,但不能保证这是问题的100%。使用
    preg\u match

    此外,如果这些特殊字符是PCRE语法的一部分,请确保它们被转义(例如:
    \.
    而不是


    我建议您增加
    error\u reporting
    和/或激活
    display\u errors
    和/或错误日志。如果你有,这是一个会被抓到的东西,因为它会抛出一个E_警告错误。

    在将你的示例转换为独立代码后(请以后发布)

    我得到了一堆这样的东西:

    PHP警告:preg_match_all()至少需要3个参数,第9行的/Users/cabbey/foo.PHP中给出了2个

    您可能应该打开错误报告

    我假设,由于您使用了_all,所以您希望对它们进行计数,在这种情况下,您希望将regexp更改为不贪婪

    $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";
        }
    
    }
    
    $r1='/[A-Z]{1}/'//大写字母
    $r2='/[a-z]{1}/'//小写字母
    $r3='/[!@$%^&*(),-]{1}/'/不管你说的“特殊字符”是什么意思
    $r4='/[0-9]{1}/'//数字
    $found=array();
    foreach(数组('lowercaseepw','8B_dip+3','Barrywidg@t1o“)作为$pass){
    如果(!preg_match_all($r4,$pass,$found)){
    echo“密码不包含数字:$pass\n”;
    }否则{
    回显“已找到”。计数($found[0])“数字\n”;
    }
    如果(!preg_match_all($r2,$pass,$found)){
    echo“密码不包含小写字母:$pass\n”;
    }否则{
    echo“found”.count($found[0])“小写\n”;
    }
    如果(!preg_match_all($r1,$pass,$found)){
    echo“密码不包含大写字母:$pass\n”;
    }否则{
    echo“found”.count($found[0])“大写\n”;
    }
    }
    
    谢谢-似乎就是这样。谢谢,我检查了phperor.log,但可能我没有将日志设置得足够高。
    $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";
        }
    
    }