我正在尝试使用由“ - ”分隔的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';
}
非常感谢任何帮助。
答案 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
^((?<r){5})-((?<r){5})-((?<r){5})-((?<r){5})-((?<r){5})$(?(DEFINE)(?<ltr>(?![B])[A-Z]))
扩展:
^ # BOS
( (?<r){5} ) # (1)
-
( (?<r){5} ) # (2)
-
( (?<r){5} ) # (3)
-
( (?<r){5} ) # (4)
-
( (?<r){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)
)