2012-03-18 6 views
1

私は一連の検証クラスを作成しています。現在、さまざまな検証ルールを適用するためのプラグインを構築中です。私は、英国の郵便番号を検証するための次のクラスを構築しました:PostcodeUk ::パターンで定義された複雑な正規表現を行制限する

class PostcodeUk extends abstr\Prop implements iface\Prop 
{ 
    const 

     /** 
     * Defines the regular expression against which to test postal code 
     * 
     * @see http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom#Validation UK postal code validation rules on Wikipedia 
     */ 
     PATTERN = '/^(GIR 0AA)|(((A[BL]|B[ABDHLNRSTX]?|C[ABFHMORTVW]|D[ADEGHLNTY]|E[HNX]?|F[KY]|G[LUY]?|H[ADGPRSUX]|I[GMPV]|JE|K[ATWY]|L[ADELNSU]?|M[EKL]?|N[EGNPRW]?|O[LX]|P[AEHLOR]|R[GHM]|S[AEGKLMNOPRSTY]?|T[ADFNQRSW]|UB|W[ADFNRSV]|YO|ZE)[1-9]?[0-9]|((E|N|NW|SE|SW|W)1|EC[1-4]|WC[12])[A-HJKMNPR-Y]|(SW|W)([2-9]|[1-9][0-9])|EC[1-9][0-9]) [0-9][ABD-HJLNP-UW-Z]{2})$/'; 

    /** 
    * 
    * @return bool True if valid 
    * @throws \InvalidArgumentException 
    */ 
    public function isValid() 
    { 
     $valid = false; 
     $data = $this -> getData(); 

     switch (gettype ($data)) 
     { 
      case 'NULL'  : 
       $valid = true; 
      break; 
      case 'string' : 
       $valid = preg_match (static::PATTERN, $data) > 0; 
      break; 
      default   : 
       throw new \InvalidArgumentException (__CLASS__ . ': This property cannot be applied to data of type ' . gettype ($data)); 
      break; 
     } 

     return ($valid); 
    } 
} 

正規表現が由来してWikipedia's article on UK postcodesに与えられた上で。しかし、与えられた正規表現は、より大きなテキストブロックに含まれる有効なポストコード文字列を検出します。前後の文字を除いて、有効なポストコードと完全に一致するようにします。したがって(SW1A 0AA)は有効として渡す必要がありますが、(foobarSW1A 0AA)は許可しないでください。

私は、正当なものとして郵便番号だけで構成される文字列を受け入れるようにするために、アンカーを正規表現(先頭は^、最後は$)に追加しました。しかし、このクラスはパディングやポストコードのない文字列をラップするポストコードを渡します。

私は間違っていますか?アンカーを追加すれば、私が望む振る舞いを得るのに十分だと思った。

答えて

3

としてアンカーを追加します。

^(?:regex)$ 

^foo|bar$^(?:foo|bar)$と同じではありません。

また$の代わりに\zを使用する必要があります。 $は、文字列の末尾でオプションの改行を許可しますが、\zは文字列一致の厳密な終了です。

+0

+1明らかな問題が見つかりました。 – xfix

+0

申し訳ありませんが、ちょっとした説明が必要です。あなたは '/ ^(?:(GIR 0AA)|(愚かなばか等)など)$'を意味しますか? (OK、編集すると少し鮮明になります、ありがとう) – GordonM

+0

@GordonM、はい、しかし '\ z'を使います。 – Qtax