Php 重复或增量字符的preg匹配

Php 重复或增量字符的preg匹配,php,regex,preg-match,Php,Regex,Preg Match,我正在使用preg match验证密码,如下所示: (preg_match("/^.*(?=.{5,}).*$/", $password) 也可以接受特殊字符 但由于某些原因,我需要修改它,它应该可以接受 只有字母数字 至少5个字符长 非常重要的是,它不能有任何重复或重复 增量字符,如:aaaa或12345或abc123等 .扩展到@TimPietzcker,他应该获得所有荣誉。所以一定要对他的答案投赞成票。但我需要这个: 没有三重重复字符 无三重增量字符/数字 因为双增量字符很奇怪,你甚

我正在使用preg match验证密码,如下所示:

(preg_match("/^.*(?=.{5,}).*$/", $password)
也可以接受特殊字符

但由于某些原因,我需要修改它,它应该可以接受

  • 只有字母数字
  • 至少5个字符长
  • 非常重要的是,它不能有任何重复或重复 增量字符,如:aaaa或12345或abc123等

.

扩展到@TimPietzcker,他应该获得所有荣誉。所以一定要对他的答案投赞成票。但我需要这个:

没有三重重复字符

无三重增量字符/数字

因为双增量字符很奇怪,你甚至不会注意到你做了

例如,test4x3x6是否正常工作?错误,
st
是增量字符。这只会让你的用户发疯

所以我用了这个:

function is_password_strong($password){
  $preg_res = preg_match(
      '%^           # Start of string
    (?!.*(.)\1{2})   # Assert no triple repeated characters
                  # Assert no sequential digits/characters
    (?!.*(?:012|123|234|345|456|567|678|789|890|
            abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|
            klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|
            uvw|vwx|wxy|xyz))
    .{8,}  # Match at least 8 characters
    $             # End of string%ix',
      $password);

  if ($preg_res) {

    return true;
  }else{
    return false;
  }
}

可以使用正则表达式检测重复,但不能用于增量。。。另一件事——有很多类型的“增量”-
abc
根据英文字母表是增量的,但也有“增量的”根据键盘:
qwerty
这是键盘的最上面一行,或者
asdf
这是键盘的主要一行。根据您的方案,
qwerty
将被接受,而
correcthorsebatterystaple
()将被拒绝。谢谢NHAHDH。。。。。我的意思是说增量数字,比如12345……等等,还有一系列字母,比如AAAA或BBB。。。。。。etc@sohal07您可能会从阅读中受益匪浅,因为它完全符合我的要求…..我刚刚将字符对更改为三重….再次更改为thanx。@sohal07:请注意,由于以下原因,此解决方案将拒绝
01JOMflsjdsf
01
出现-您需要通过字符串连接生成长度为3或更长的“增量”序列。另一个quicj问题。。。我是否需要接受sohaal1???我拒绝了,因为有两个连续的字母“a”…@sohal07:当然-如果您删除重复字符的检查,那么它不会拒绝
aaaaaaa
。如果您想使检查更严格(即只拒绝三倍以上,但允许双倍),则使用
(?!*()\1{2})
而不是
(?!*()\1)
。可能不可能与常规检查同时进行,因为这将在找到第一个匹配时停止,您可能希望显示所有攻击性子字符串。但是,您可以对失败的字符串执行第二次传递,搜索
(.*)\1+|01 | 12 | 23 |…\yz
,并显示这些匹配项。
function is_password_strong($password){
  $preg_res = preg_match(
      '%^           # Start of string
    (?!.*(.)\1{2})   # Assert no triple repeated characters
                  # Assert no sequential digits/characters
    (?!.*(?:012|123|234|345|456|567|678|789|890|
            abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|
            klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|
            uvw|vwx|wxy|xyz))
    .{8,}  # Match at least 8 characters
    $             # End of string%ix',
      $password);

  if ($preg_res) {

    return true;
  }else{
    return false;
  }
}