2013-02-27 90 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,所以你的比賽不開始在開始。