在PHP中匹配正则表达式时出现警告

在PHP中匹配正则表达式时出现警告,php,regex,Php,Regex,我需要验证符合以下条件的密码: 至少有一个小字母表 至少有一个大写字母 至少一位数字 这些特殊符号中至少有一个-."$& 长度为8-15个字符 为此,我在互联网上找到了一个与正则表达式有点匹配的正则表达式,并根据我的要求对其进行了修改 <?php $pwd = "Abcdef.1"; if (preg_match("^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_.@#$&]).{8,15}$", $pwd)){ echo 'M

我需要验证符合以下条件的密码:

  • 至少有一个小字母表
  • 至少有一个大写字母
  • 至少一位数字
  • 这些特殊符号中至少有一个-."$&
  • 长度为8-15个字符
  • 为此,我在互联网上找到了一个与正则表达式有点匹配的正则表达式,并根据我的要求对其进行了修改

    <?php
       $pwd = "Abcdef.1";
       if (preg_match("^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[_.@#$&]).{8,15}$", $pwd)){
           echo 'Match Found';
       }
       else{
           echo 'No Match Found';
       }
    ?>
    
    
    
    执行脚本时,PHP会抛出一条警告: 找不到匹配项php警告:preg_Match():在[my_file_path]中找不到结尾分隔符“^”


    有什么帮助吗?

    您需要将图案括在“/”中,如下所示:

    编辑:

    好的,我将把这个大而混乱的正则表达式行分割成多个正则表达式模式,每个正则表达式模式对应一个约束,这将更容易阅读和理解,并且您可以向用户提供更具描述性的提示,说明当前输入的密码有什么问题(是否太短,是否缺少符号,是否缺少大写字母..你明白了..)

    代码如下:

    <?php
    
    function validatePassword($pass)
    {
    
        $uppercasePattern = "/[A-Z]/";
        $lowercasePattern = "/[a-z]/";
        $symbolPattern =  "/[\.\$@_#&]/";
        $digitPattern = "/[0-9]/";
        $unwantedSymbolsPattern = "/[^\w\.\$@_#&]/";
    
        $len = strlen($pass);
    
        if($len >=8 && $len <= 15){ // check if length is 8 - 15
            $hasUppercase = false;
            preg_match($uppercasePattern, $pass, $hasUppercase); // check if has uppercase letter
    
    
            if(!empty($hasUppercase)){
                $hasLowercase = false;
                preg_match($lowercasePattern, $pass, $hasLowercase); // check if has lowercase letter
    
    
                if(!empty($hasLowercase)){
                    $hasSymbol = false;
                    preg_match($symbolPattern, $pass, $hasSymbol); // check if has symbol
    
    
                    if(!empty($hasSymbol)){
                        $hasDigit = false;
                        preg_match($digitPattern, $pass, $hasDigit); // check if has digit
    
    
                        if(!empty($hasDigit)){ // check if contains needed symbol
                            $hasUnwantedSymbols = false;
                            preg_match($unwantedSymbolsPattern, $pass, $hasUnwantedSymbols);
    
                            if(empty($hasUnwantedSymbols)){ // if doesnt contain unwanted symbols return true
                                return true;
                            }else{
                                echo "Password contains some of the unwanted symbols!";
                            }
                        }else{
                            echo "Missing digit!";
                        }
                    }else{
                        echo "Missing on of the following symbols: . _ @ $ # &";
                    }
                }else{
                    echo "Missing uppercase letter!";
                }
            }else{
                echo "Missing uppercase letter!";
            }
        }
        else{
            echo "Password length not OK!";
        }
    }
    
    
    
    $pass = "Abcdef@1as#(";
    
    // call the function to test it out
    if(validatePassword($pass)){
        echo "OK";
    }
    
    
    ?>
    
    
    
    这对人类来说不是很容易理解。如果必须添加另一条规则会怎么样?@ConstantinGALBENU:到目前为止,我只需要这些规则。仅供参考,php需要在字符串中使用正则表达式分隔符。`“regex”。分隔符可以是除空格以外的任何字符,并且除非使用括号,否则起始和结束delim必须是相同的字符。此外,如果分隔符在正则表达式中使用,则必须对其进行转义。它现在可以工作,但它仍然接受除我所需之外的符号。就像它传递了字符串一样Abcdef@1)我通过了(这是我不想让它做的。好了,我编辑了答案,现在可以了……如果它对你有效,请标记为正确答案。干杯!谢谢。你的解决方案很长,但很有效。同时,我用正则表达式和普通PHP代码的混合缩短了它。
    <?php
    
    function validatePassword($pass)
    {
    
        $uppercasePattern = "/[A-Z]/";
        $lowercasePattern = "/[a-z]/";
        $symbolPattern =  "/[\.\$@_#&]/";
        $digitPattern = "/[0-9]/";
        $unwantedSymbolsPattern = "/[^\w\.\$@_#&]/";
    
        $len = strlen($pass);
    
        if($len >=8 && $len <= 15){ // check if length is 8 - 15
            $hasUppercase = false;
            preg_match($uppercasePattern, $pass, $hasUppercase); // check if has uppercase letter
    
    
            if(!empty($hasUppercase)){
                $hasLowercase = false;
                preg_match($lowercasePattern, $pass, $hasLowercase); // check if has lowercase letter
    
    
                if(!empty($hasLowercase)){
                    $hasSymbol = false;
                    preg_match($symbolPattern, $pass, $hasSymbol); // check if has symbol
    
    
                    if(!empty($hasSymbol)){
                        $hasDigit = false;
                        preg_match($digitPattern, $pass, $hasDigit); // check if has digit
    
    
                        if(!empty($hasDigit)){ // check if contains needed symbol
                            $hasUnwantedSymbols = false;
                            preg_match($unwantedSymbolsPattern, $pass, $hasUnwantedSymbols);
    
                            if(empty($hasUnwantedSymbols)){ // if doesnt contain unwanted symbols return true
                                return true;
                            }else{
                                echo "Password contains some of the unwanted symbols!";
                            }
                        }else{
                            echo "Missing digit!";
                        }
                    }else{
                        echo "Missing on of the following symbols: . _ @ $ # &";
                    }
                }else{
                    echo "Missing uppercase letter!";
                }
            }else{
                echo "Missing uppercase letter!";
            }
        }
        else{
            echo "Password length not OK!";
        }
    }
    
    
    
    $pass = "Abcdef@1as#(";
    
    // call the function to test it out
    if(validatePassword($pass)){
        echo "OK";
    }
    
    
    ?>