2013-02-27 38 views
2

我需要一个正则表达式来验证下面的代码, 后面的代码我说明了期望的结果。这个表达式的正则表达式'PI-1234-265K'

<?php 
    $codes[] = 'PI-1234-265K'; // true 
    $codes[] = 'PIS2-12FG-265K'; // false 
    $codes[] = 'PI-1234FG-265K'; // false 
    $codes[] = 'PI-1234-2'; // false 
    $codes[] = 'PI-1234-265K12313'; // true 
    foreach($codes as $code){ 
     var_dump(preg_match('/[a-zA-Z0-9]{2}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{2,}/', $code)); 
     echo '<br/>'; 
    } 
?> 

目前第一部分没有得到适当的检查,它返回11001,但期望的结果是10001

+0

您已经指定了在第一个“ - ”之前有两个数字或两个字母。在你的一个代码中,有四个。无论如何,有些东西会跳出来。 – christopher 2013-02-27 13:51:21

+0

已经有了一个很好的答案,所以不需要跳进去。但是,不用[A-Za-z ...],你可以提供/ i作为修饰符以匹配不区分大小写,或者使用更短的[\ w \ d] {2}来代替。完整模式可能如下所示:'preg_match('#^ [\ w \ d] {2} - [\ w \ d] {4} - [\ w \ d] {2,} $#i' PI-1234-265K')'(在这种情况下,i修饰符是多余的) – ExternalUse 2013-02-27 14:03:40

+0

@ExternalUse,你用'i'修饰符正确,但是'\ w'类也包含下划线,如果这不是想要'\ w'将是错误的选择。另一方面,'\ w'也包含数字'\ d',所以不需要'[\ w \ d]'。 – stema 2013-02-27 14:08:55

回答

3

您需要anchor您正则表达式

var_dump(preg_match('/^[a-zA-Z0-9]{2}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{2,}$/', $code)); 

^是匹配的开始的字符串

$匹配字符串的末尾

如果你不这样做,你会得到部分匹配。在你的第二种情况下意味着“PIS2-12FG-265K”它匹配S2-12FG-265K,所以你的比赛不开始在开始。

相关问题