Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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 Regex强密码指定特殊字符_Php_Regex - Fatal编程技术网

Php Regex强密码指定特殊字符

Php Regex强密码指定特殊字符,php,regex,Php,Regex,我目前正在用正则表达式做一些测试。我做了一个练习,要求检查强密码,这意味着它应该有:至少一个数字,一个小写字母,一个大写字母,没有空格,至少一个 不是字母或数字的字符。它应该在8-16个字符之间 我写了这段代码: <?php $passwords = array("Jtuhn", "12J@k", "jok", "Joan 12@45", "Jghf2@45", "Joan=?j123j"); foreach($passwords as $pass) {

我目前正在用正则表达式做一些测试。我做了一个练习,要求检查强密码,这意味着它应该有:至少一个数字,一个小写字母,一个大写字母,没有空格,至少一个 不是字母或数字的字符。它应该在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>";
  }
 ?>
这应该是模式匹配,至少有一个字符不是字母或数字,但我不明白为什么。
我知道这个强密码是在互联网上解决的,但这不是我的问题。我的问题是为什么这部分工作不做应该做的事。

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

^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}\S+$

//The rule is at least
   one upper case, one lower case, one digit[0-9], 
   one special character[#?!@$%^&*-] and the minimum length should be 8.
它将允许您编写更可读的条件并显示特定的错误消息。尽管如此,regexp模式将更易于编写和理解

i、 e:

$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";
}
$errors=array();
如果(斯特伦($pass)<8 |斯特伦($pass)>16){
$errors[]=“密码应至少为8个字符,最多为16个字符”;
}
如果(!preg_匹配(“/\d/”,$pass)){
$errors[]=“密码应至少包含一位数字”;
}
如果(!preg_匹配(“/[A-Z]/”,$pass)){
$errors[]=“密码应至少包含一个大写字母”;
}
如果(!preg_匹配(“/[a-z]/”,$pass)){
$errors[]=“密码应至少包含一个小写字母”;
}
如果(!preg_匹配(“/\W/”,$pass)){
$errors[]=“密码应至少包含一个特殊字符”;
}
如果(预匹配(“/\s/”,$pass)){
$errors[]=“密码不应包含任何空白”;
}
如果($errors){
foreach($errors作为$error){
echo$错误。“\n”;
}
模具();
}否则{
回显“$pass=>MATCH\n”;
}
希望能有帮助

您可以尝试以下方法:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.* )(?=.*[^a-zA-Z0-9]).{8,16}$
它能满足你所有的要求

  • (?=.*\d)
    至少一个数字
  • (?=.[a-z])
    至少一个小写字母
  • (?=.[A-Z])
    至少一个大写字母
  • (?!*)
    没有空格
  • (?=.[^a-zA-Z0-9])
    a-zA-Z0-9
  • {8,16}
    介于8到16个字符之间
  • 示例代码:

    <?php
    $re = '/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.* )(?=.*[^a-zA-Z0-9]).{8,16}$/m';
    $str = 'Jtuhn
    12J@k
    jok
    Joan 12@45
    Jghf2@45
    Joan=?j123j
    ';
    
    preg_match_all($re, $str, $matches);
    print_r($matches);
    
    ?>
    
    
    

    使用这个简单的正则表达式来测试强密码

    /(?=^.{8,}$)(?=.{0,}[A-Z])(?=.{0,}[a-z])(?=.{0,}\W)(?=.{0,}\d)/g
    
    Javascript:

    var password = "Abcdef@1234"
    var passwordRegex = /(?=^.{8,}$)(?=.{0,}[A-Z])(?=.{0,}[a-z])(?=.{0,}\W)(?=.{0,}\d)/g
    
    var isStrongPassword = passwordRegex.test(password)
    
    console.log(isStrongPassword, "<Strong password>")
    
    var密码=”Abcdef@1234"
    var passwordRegex=/(?=^.{8,}$)(?=.{0,}[A-Z])(?=.{0,}[A-Z])(?=.{0,}\W)(?=.{0,}\d)/g
    var isStrongPassword=passwordRegex.test(密码)
    console.log(isStrongPassword,”)
    
  • 最小长度为8个字符
  • 至少1个大写字母
  • 至少1个小写字母
  • 至少1个特殊字符
  • 至少1位

  • 强密码是不可预测的密码,而正则表达式检查模式。如果某件事遵循某种模式,它就不可能是不可预测的。。。而且,17个字符的密码比16个字符的密码强,所以这是一个愚蠢的限制。@Narf我认为这没什么大不了的。。我真正的问题在于模式。假设(?=\w*[^0-9A-Za-z])检查顺序不重要的特殊字符。但这不起作用。如果我删除它,那么如果密码包含一个大写字母、一个小写字母和一个数字,那么模式会很好地验证密码。当我添加这个时,它不会验证任何内容,所有内容都会失败。您的正则表达式是
    ^\w*[lookaheads]\w*$
    。它不会匹配任何包含特殊字符的内容,而且容易发生灾难性的回溯。@拉温:为什么?我应该从正则表达式中删除任何内容吗?只需在字符串的开头触发前瞻断言。您的主要条件是匹配8-16个非空格字符
    ^\S{8,16}$
    ,并在
    ^
    开始处添加您的条件。这非常有效,谢谢@Maverick_Mrt^[a-zA-Z0-9]意味着期待a-zA-Z0-9。这个[^a-zA-Z0-9]是错误的吗?因为我在一本书中读到了这一条,这就是我写它的原因…@Maverick_Mrt,我复制粘贴了你的正则表达式:^(?=.\d)(?=.[a-z])(?=.[a-z])(?!.*)(?!。(?=.^[a-zA-Z0-9]){8,16}$,它工作得很好,我只是不明白,[^a-zA Z0 9]是错误的方法,如果我真想期待a-zA-Z0-9?很高兴它能为你工作[^a-zA Z0 9]表示否定字符类它将匹配任何不是A-Z或A-Z或0-9的字符。。。这是一个完全有效的解释syntax@JoanPlepi我删除了我的评论,因为我认为你的评论已经很清楚了:)我认为
    ^[a-zA-Z0-9]
    是一个打字错误。也许这是因为您尝试了多行模式。这很好,但您应该取消并没有空格的正则表达式,并将密码长度限制至少提高到100。密码应该是散列的,这样就不需要限制空白,许多人使用密码管理器,它可以生成长达100个字符的密码。如果不考虑这一点,黑客就可以缩小密码选择范围,让他们有更好的机会强行进入帐户。是的,这很有帮助。找到每个字符串中哪些规则被打破的好方法。谢谢
    var password = "Abcdef@1234"
    var passwordRegex = /(?=^.{8,}$)(?=.{0,}[A-Z])(?=.{0,}[a-z])(?=.{0,}\W)(?=.{0,}\d)/g
    
    var isStrongPassword = passwordRegex.test(password)
    
    console.log(isStrongPassword, "<Strong password>")