Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.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 至少匹配1个大写、1个特殊、4个非连续数字,长度为6到14_Php_Regex - Fatal编程技术网

Php 至少匹配1个大写、1个特殊、4个非连续数字,长度为6到14

Php 至少匹配1个大写、1个特殊、4个非连续数字,长度为6到14,php,regex,Php,Regex,我尝试匹配至少1个大写字母,1个特殊字母,4个非连续数字,长度为6到14 我尝试了以下正则表达式: ((?=(.[^A-Za-z0-9])+)(?=(.[A-Z])+(?=(.[A-Z]))(?=(.[A-Z])+)(?!=([\d])\\1\\1\\1)。{6,14} 但以下所有字符串都匹配: abDc#E0%F9$845, abDc#E0%F9$8y6, abDc#E0981, #ab1DcE09w1234 **(4 sequential numbers)**, #ab1111Dc

我尝试匹配至少1个大写字母,1个特殊字母,4个非连续数字,长度为6到14

我尝试了以下正则表达式:

((?=(.[^A-Za-z0-9])+)(?=(.[A-Z])+(?=(.[A-Z]))(?=(.[A-Z])+)(?!=([\d])\\1\\1\\1)。{6,14}

但以下所有字符串都匹配:

abDc#E0%F9$845, 
abDc#E0%F9$8y6, 
abDc#E0981, 
#ab1DcE09w1234  **(4 sequential numbers)**, 
#ab1111DcE09, 
E$ab1Dc098, 
1$Eab1Dc0989, 
T3$s7p4s$123, 
T1234$stPass    **(4 sequential numbers)**
而且不匹配:

testpass, 
abDc#E0%F9$8y67 (15 characters), 
t3stpass, 
te$stpass, 
TestPass, 
T3$stpass

如何修复它?

试试这个,使用前请先测试一下:

function validate_password($password){

 if(empty($password))
  return false;

 if(strlen($password) < 4 || strlen($password) > 14)
  return false;

 $uppercase_test = preg_match('#[A-Z]+#', $password);

 //include special charactors that you want
 $special_test = preg_match('#[!@$%^&*()_+=-]+#', $password);

 $nonsequencial_number_test = !preg_match('#(\d)\\1{4,}#', $password);

 if($uppercase_test && $special_test && $nonsequencial_number_test){
  return true;
 }

 return false;

}
var_dump(validate_password('abDc#E0%F9$8y6'));
函数验证密码($password){
if(空($password))
返回false;
如果(strlen($password)<4 | strlen($password)>14)
返回false;
$uppercase_test=preg_match(“#[A-Z]+#”,$password);
//包括您想要的特殊字符
$special_test=preg_match(“#[!@$%^&*()#+=-]+#”,$password);
$nonsequencial_number_test=!preg_match('#(\d)\\1{4,}#',$password);
if($大写字母测试和$特殊字母测试和$非顺序字母测试){
返回true;
}
返回false;
}
变量转储(验证密码('abDc#E0%F9$8y6');

使用以下PHP页面测试正则表达式。

1) strlen检查字符串长度
2) 第一个preg_匹配检查一个或多个大写字母
3) 第二次预匹配检查至少4个数字
4) 第三个预匹配检查4个序列号(升序和降序)
5) 第四个preg_匹配检查至少一个特殊字符

<?php
if (isset($_GET['string'])) {
    if ($_GET['string'] != '') {
        $string = $_GET['string'];
    } else {
        echo "Empty string.";
    }
}
?>
<pre>
<html>
  <head>
    <title>Regular Expression Tester</title>
  </head>
  <body>
    <form action="" method="get">
      <input type="text" name="string" />
      <input type="submit" value="Send" />
</form>
</pre>
<?php
if (isset($_GET['string'])) {

    if(strlen($string) >= 6 && strlen($string) <= 14) { // length between 6 and 14
        echo "Size between 6 and 14: <b><span style=\"color:green;\">OK</span></b>", "<br>";

        if (preg_match('#[A-Z]+#', $string)) { // one or more uppercase chars
            echo utf8_decode("At least one uppercase: <b><span style=\"color:green;\">OK</span></b>"), "<br>";

            if (preg_match('#(?=.*[0-9]{1}.*[0-9]{1}.*[0-9]{1}.*[0-9]{1})#', $string)) { // it has at least 4 numbers anywhere
                if (!preg_match('#(0123|1234|2345|3456|4567|5678|6789|3210|4321|5432|6543|7654|8765|9876|0000|1111|2222|3333|4444|5555|6666|7777|8888|9999)#', $string)) { // sequential numbers
                    echo utf8_decode("4 non-sequential numbers: <b><span style=\"color:green;\">OK</span></b>"), "<br>";

                    if (preg_match('#[!@$%^&*()_+=-]+#', $string)) { // special chars
                        echo utf8_decode("At least one special character: <b><span style=\"color:green;\">OK</span></b>"), "<br>";
                        echo utf8_decode("<br>$string <b><span style=\"color:green;\">PASSED</span></b>");
                        exit;

                    } else {
                        echo utf8_decode("At least one special character: <b><span style=\"color:red;\">FAILED</span></b>"), "<br>";
                    }

                } else {
                    echo utf8_decode("4 non-sequential numbers: <b><span style=\"color:red;\">FAILED</span></b>"), "<br>";
                }
            } else {
                echo utf8_decode("4 non-sequential numbers: <b><span style=\"color:red;\">FAILED</span></b>"), "<br>";
            }

        } else {
            echo utf8_decode("At least one uppercase: <b><span style=\"color:red;\">FAILED</span></b>"), "<br>";
        }

    } else {
        echo "Size between 6 and 14: <b><span style=\"color:red;\">FAILED</span></b>", "<br>";
    }

    echo utf8_decode("<br>$string <b><span style=\"color:red;\">DIDN'T PASS</span></b>");
}
?>
  <pre>
  </body>
</html>
</pre>

正则表达式测试器
那么:

其中:


这不是你想要的吗?你说6-14个字符和15不在6到14之间。但是有些有4个顺序数字。啊,是的。没有什么比按下SHIFT键时的一行键盘混音更清楚地显示“1个大写字母,1个特殊字母,4个非连续数字,长度6到14”。你应该考虑用适当的可读代码替换这个混乱。正则表达式适用于很多任务,但这不是其中之一。你是说用于检查大写字符等的PHP函数?每一步都有一个preg\u match\u all您不必将所有支票放在一个巨大的regexp中,是吗?您可以使用4个更小、更简单的regexps.Heh来检查它。但它仍然不能满足OP的要求
(\d)\\1{4,}
将只检测像
1111
2222
这样的字符串。这不是OP的要求。他/她想检测连续(或顺序)数字,如:
1234
5678
等。这在正则表达式和逆顺序数字(如4321)中不容易实现。但T1111美元的戒指是可以根据!孕赛会比赛((“ţ,((((\d)d)d)1{4,{4,{4,{4,,,,$密码)改为(0123 1243 1243 1244;1234 1244四四四4 1244)4 12444 1244;1234 12441244 1244四四四四四四四四四四四四四四四四四四四5 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 1245 33;。。。我必须为“它有4个数字”添加正则表达式,用于#(?=.*\d){4,}#检查它是否有4个数字,但它不起作用。。。为$123A编辑匹配ok:更改为#(?=.*\d{4,})#,它现在正在工作。。。去answer@AmalMurali:这是一个帮助OP证明的示例代码。我的测试页面上说
1eW23tua4 5
正常(仅限
1eW23tua4
)是的,你说得对。我的错:-(要删除我的评论。太好了!只需在第一行
{
之前添加一个
。@RodrigoSiejaBertin:好的,我已经纠正了输入错误。谢谢。
中的冒号(?=(?:..\d){4,})
。@RodrigoSiejaBertin:
(?:…)
是一个非捕获组,请参阅:嗯…如果我不使用冒号,它“停止”了何时找到第一个数字?
if (preg_match('/^(?=.*[A-Z])(?=(?:.*\d){4,})(?=.*[!@$%^&*()_+=-]).{6,14}$/', $string)) {
    // remove all non digit
    $tmp = preg_replace('/\D+/', '', $string);
    if (preg_match('/0123|1234|2345|3456|4567|5678|6789|3210|4321|5432|6543|7654|8765|9876|0000|1111|2222|3333|4444|5555|6666|7777|8888|9999/', $string)) {
        echo "Failed\n";
    }
    echo "Pass\n";
} else {
    echo "Failed\n";
}
(?=.*[A-Z])             : at least one uppercase
(?=(?:.*\d){4,})        : at least 4 digits
(?=.*[!@$%^&*()_+=-])   : at least one special character
.{6,14}                 : from 6 to 14 character long