我目前正在使用正则表达式进行一些测试。我有一个练习要求检查强密码,这意味着它应该有:至少一个数字,一个小写字母,一个大写字母,没有空格,并且至少有一个
不是字母或数字的字符。它应该在8-16个字符之间。

我写了这段代码:

     <?php

  $passwords = array("Jtuhn", "12J@k", "jok", "Joan 12@45", "Jghf2@45", "Joan=?j123j");

  foreach($passwords as $pass)
  {
    ///^\w*(?=\w*\d)(?=\w*[a-z])(?=\w*[A-Z])\w*$/
    if(strlen($pass) >= 8 && strlen($pass) < 17)
     {
       if(preg_match("/^\w*(?=\w*\d)(?=\w*[A-Z])(?=\w*[^0-9A-Za-z])(?=\w*[a-z])\w*$/", $pass) )
        echo "$pass => MATCH<br>";
       else
        echo "$pass => FAIL<br>";
     }
    else
      echo "$pass => FAIL(because of length)<br>";
  }
 ?>

最后两个应该匹配,但它们失败了。我认为问题在于
(?=\w*[^0-9A-Za-z])

这应该是模式匹配,至少有一个不是字母或数字的字符,但我不知道为什么。
我知道这个强密码是在互联网上解决的,但这不是我的问题。我的问题是为什么那部分工作没有做应该做的事情。

最佳答案

您可以将正则表达式拆分为不同的检查。

它将允许您编写更具可读性的条件并显示特定的错误消息。虽然,正则表达式模式将更容易编写和理解。

IE。 :

$errors = array();
if (strlen($pass) < 8 || strlen($pass) > 16) {
    $errors[] = "Password should be min 8 characters and max 16 characters";
}
if (!preg_match("/\d/", $pass)) {
    $errors[] = "Password should contain at least one digit";
}
if (!preg_match("/[A-Z]/", $pass)) {
    $errors[] = "Password should contain at least one Capital Letter";
}
if (!preg_match("/[a-z]/", $pass)) {
    $errors[] = "Password should contain at least one small Letter";
}
if (!preg_match("/\W/", $pass)) {
    $errors[] = "Password should contain at least one special character";
}
if (preg_match("/\s/", $pass)) {
    $errors[] = "Password should not contain any white space";
}

if ($errors) {
    foreach ($errors as $error) {
        echo $error . "\n";
    }
    die();
} else {
    echo "$pass => MATCH\n";
}

希望能帮助到你。

关于php - 正则表达式强密码特殊字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42467243/

10-14 13:58
查看更多