我正在创建一个密码验证工具,我想要的一个要求是防止用户连续输入太多字母。任何字母,包括大写字母,都不能以3次或更多次的顺序重复。
我的方法是使用for循环移动密码字符串,并在其中使用正则表达式嵌入一些检查。我似乎无法使逻辑工作,它可能很简单。这是我(很多)尝试破解这个问题的尝试之一:
$seqLetterCounter = 0;
for($i=0; $i < strlen($password); ++$i) {
if($password{$i} == '/([a-zA-Z])/') {
$seqLetterCounter++;
}
if($seqLetterCounter > $this->maxSeqLetters){
$this->errors[6] = 'You have used too many sequential letters in your password. The maximum allowed is ' . $this->maxSeqLetters . '.';
}
if($password{$i} == '/([^a-zA-Z])/') {
$seqLetterCounter = 0;
}
}
$ password - 表单中的已发布值。
$ maxSeqLetters - 保存变量,保存由用户定义的整数值。
errors [] - 一个数组,用于确定密码是否在各种检查中失败。
任何人都有一些指示?
答案 0 :(得分:11)
使用正则表达式相当简单:
if (preg_match('/(\w)\1{2,}/', $password)) {
die("3+ repeated chars not allowed");
}
搜索字符(\w
),存储它(()
),然后查看相同的字符是否会在之后(\1
)出现两次或更多次{2,}
ok ...所以如果连续的3个以上的字母或数字都没出来,那么试试
/([a-z]{3,}|[0-9]{3,})/i
代替正则表达式。搜索任何字母([a-z]
)或(|
)个数字([0-9]
),这些数字会出现3次或更多次({3,}
),并在案例中进行匹配 - 不敏感的方式(i
),所以你不必担心aAa打破了比赛。