2012-03-28 18 views
5

Ich versuche, ein modifiziertes Preg-Format von preg_match: check birthday format (dd/mm/yyyy) zu verwenden, Kreditkarte Verfallsdaten (yyyy-MM-Formate)PHP preg_match ein Datumsformat "yyyy-MM"

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

Aus irgendeinem Grund ist es auch passend validiere ungültige Werte wie 20111-02 (ungültiges Jahr). Was mache ich hier falsch? Ich möchte das Jahr 4 Ziffern bestätigen und der Monat 2 Ziffern (01, 02 .. 12)

Antwort

9

Anchor Ihr regexp:

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

Ihr regexp nicht tun, was Sie erwartet, weil es "0111-02" String von "20111-02" übereinstimmt.

Anchors^ und $ Spiel bestimmte Positionen innerhalb der Eingabezeichenfolge: ^ entspricht den Anfang des Strings und $ stimmt mit dem Ende.

Beachten Sie auch, dass der Bindestrich nicht entfernt werden muss, da er in [] nur eine spezielle Funktion hat.

4

Verwenden ^ und $ Anker:

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

, um sicherzustellen, die gesamte Zeichenkette das Muster übereinstimmt.

In Ihrem Beispiel entspricht 20111-02, weil es mit dem 0111-02 Teil von 20111-02 übereinstimmt.

2

Es entspricht 0111-02, die Ihren Anforderungen entspricht.

Wechsel:

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

zu:

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

so dass es nur Kontrollen gegen die Gesamtheit der Zeichenfolge.

2

versuchen Sie dies: if (!preg_match('/^([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) {

2

dieses Probieren Sie es sowohl Datumsformat helfen zu überprüfen und prüfen, ob das Datum, wenn gültig ist oder nicht:

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'); 
}