校验密码不能出现6位以上的连续字符

需求: 实时校验用户输入的密码,如果出现连续的6位或以上的数字、字母,则给出提示,校验不通过。比如123456、456789、abcdef、ABCDEFG。

思路: 连续性可以通过字符的ASCII码是否相差1来判断。由于最低只要出现六位的连续字符就不予通过,所以我们只需判断密码中随机的六位连续字符,也就是说当用户输入的密码达到6位时,开始校验。

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
let testData = '1234dsadsa' // 数据是随用户输入实时变化的
let len = testData.length
let flag = true // 是否通过校验
if (len > 5) { // 输入第六位时开始校验
flag = verification(len)

function verification(index) {
let reg = /^[0-9]*$/
let count = 0 // 记录连续字符出现的次数
for (let i = index - 5; i < index; i++) {
let current = reg.test(testData[i - 1]) ? testData[i - 1] : testData[i - 1].charCodeAt() // 字符如果为英文则转成ASCII码
let next = reg.test(testData[i]) ? testData[i] : testData[i].charCodeAt()
if (next - current === 1) { // 相差为1:升序
count += 1
}
}
if (count > 4) { // 有6位连续数
return false
} else if (count < 5 && index > 6) { // 输入大于6位且最后6位没有连续,继续校验倒数第二位到倒数第7位,以此类推到数据前6位
return verification(index - 1) // 递归
} else {
return true
}
}
}
console.log(flag)