2012-03-28 9 views
5

私はそれも、クレジットカードの有効期限(YYYY-MM形式)何らかの理由でPHPするpreg_match日付フォーマット「YYYY-MM」

if (!preg_match('/([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) { 
     throw new Services_Payment_Exception('Card expiration date is invalid'); 
    } 

に一致するようにpreg_match: check birthday format (dd/mm/yyyy)から変更プリプレグ形式を使用しようとしています20111-02(無効年)などの無効な値を検証します。 ここで何が間違っていますか?私は年が4桁であることを確認したいと月は2桁の数字(01、02 ... 12)

答えて

9

アンカーあなたの正規表現:それは「20111から02」の「0111から02」のサブストリングに一致するので、あなたが期待したものやらなかった

preg_match('/^([0-9]{4})-([0-9]{2})$/', $expirationDate, $matches) 

あなたの正規表現。

Anchors^$入力文字列内の特定の位置を一致させる:^は、文字列の先頭にマッチし、$最後にマッチします。

[]に特別な機能しかないので、ハイフンをエスケープする必要はありません。

4

使用^$アンカーです:

if (!preg_match('/^([0-9]{4})\-([0-9]{2})$/', $expirationDate, $matches)) { 
    throw new Services_Payment_Exception('Card expiration date is invalid'); 
} 

は、文字列全体がパターンに一致することを確認します。

0111-02の部分が20111-02に一致するため、20111-02の例が一致します。

2

あなたの要件に適合する0111-02と一致しています。

変更:

'/([0-9]{4})\-([0-9]{2})/' 

へ:文字列の全体に対して

'/^([0-9]{4})\-([0-9]{2})$/' 

ので、それだけをチェックします。

2

これを試してみてください。 if (!preg_match('/^([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) {

2

それは両方の日付形式をチェック助け、日付あれば有効か無効かどうかをチェックします、これを試してみてください:

if (!preg_match('/^([0-9]{4})\-([0-9]{2})$/', $expirationDate, $matches)) { 
    throw new Services_Payment_Exception('Card expiration date is wrong format'); 

}else if (!strtotime($expirationDate)){ 
    throw new Services_Payment_Exception('Card expiration date is invalid'); 
} 
関連する問題