PHP正则表达式随机模式为5个字符

时间:2015-06-06 17:56:07

标签: php regex

我正在尝试使用由“ - ”分隔的5组5个随机字母的模式检查许可证密钥。我想验证以下内容:每组由5个字母组成,每个组不接触某些字母,所有组都是大写字母。我知道我可以使用以下内容执行此操作,但我相信有一种更简单的方法可以使用单个正则表达式:

$testKey = 'ASDFG-ASDFG-ASDFG-ASDFG-ASDFG';
$testKeyArray = explode('-', $testKey);
$cntKey = count($testKeyArray);
if($cntKey != 5) {
    echo 'Failed';
} else {
    for($x=0;$x<$cntKey;++$x) {
        if(strlen($testKeyArray[$x]) != 5) {
            echo 'Failed';
        }
        if(preg_match("^[B]^",$testKeyArray[$x]) == 1) {
            echo 'Failed';
        }
    }
    echo 'Success';
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

^\w{5}-\w{5}-\w{5}-\w{5}-\w{5}$

将匹配任何字母数字字符和下划线,我相信您只想匹配字母字符:

  

所有组都是大写字母

在这种情况下使用

/^[A-Z]{5}-[A-Z]{5}-[A-Z]{5}-[A-Z]{5}-[A-Z]{5}$/

示例:

$pattern = "/^[A-Z]{5}-[A-Z]{5}-[A-Z]{5}-[A-Z]{5}-[A-Z]{5}$/";
if (preg_match($pattern, "ASDFG-ASDFG-ASDFG-ASDFG-ASDFG")) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}
  

每个小组都不联系某些字母

如果您希望它不包含特定字母,则需要分解范围。例如,如果您不想使用字母C,则您的范围将是[A-BD-Z]而不是[A-Z]

答案 1 :(得分:0)

这是一种相当简单的方法。在一次操作中捕获和验证。

2种方式。

  • 这种方式对于简单的类排除是最快的。

^(?!.*[B])([A-Z]{5})-([A-Z]{5})-([A-Z]{5})-([A-Z]{5})-([A-Z]{5})$

展开:

 ^                             # BOS
 (?! .* [B] )                  # Not any of these, add more
 ( [A-Z]{5} )                  # (1)
 -
 ( [A-Z]{5} )                  # (2)
 -
 ( [A-Z]{5} )                  # (3)
 -
 ( [A-Z]{5} )                  # (4)
 -
 ( [A-Z]{5} )                  # (5)
 $                             # EOS 
  • 这种方式对于复杂的表达式来说是最快的。

^((?&ltr){5})-((?&ltr){5})-((?&ltr){5})-((?&ltr){5})-((?&ltr){5})$(?(DEFINE)(?<ltr>(?![B])[A-Z]))

扩展:

 ^                             # BOS
 ( (?&ltr){5} )                # (1)
 -
 ( (?&ltr){5} )                # (2)
 -
 ( (?&ltr){5} )                # (3)
 -
 ( (?&ltr){5} )                # (4)
 -
 ( (?&ltr){5} )                # (5)
 $                             # EOS 

 (?(DEFINE)
      (?<ltr>                       # (6 start)
           (?! [B] )                     # Not any of these chars ahead, add more
           [A-Z]                         # Single any of A-Z
      )                             # (6 end)
 )