2012-03-28 19 views
5

Sto cercando di utilizzare un formato preg modificato da preg_match: check birthday format (dd/mm/yyyy) per abbinare le date di scadenza della carta di credito (formati AAAA-MM)php preg_match un formato di data "yyyy-MM"

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

Per qualche ragione, ma anche convalida valori non validi come 20111-02 (anno non valido). Cosa sto facendo di sbagliato qui? Voglio confermare l'anno è di 4 cifre e il mese è 2 cifre (01, 02 .. 12)

risposta

9

Anchor è la tua espressione regolare:

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

tuo regexp non ha fatto quello che ti aspettavi perché corrisponde "0111-02" stringa di "20.111-02".

Anchors^ e $ partita particolari posizioni all'interno della stringa di input: ^ corrisponde all'inizio della stringa e $ corrisponde alla fine.

Si noti anche che non v'è alcuna necessità di fuggire il trattino dal momento che ha solo una funzione speciale nella [].

4

Utilizzare ^ e $ ancoraggi:

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

per garantire l'intera stringa corrisponde al modello.

Nel tuo esempio 20111-02 corrisponde perché corrisponde alla parte 0111-02 di 20111-02.

2

È corrispondente allo 0111-02, che corrisponde alle vostre esigenze.

Cambio:

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

a:

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

in modo che solo i controlli contro la totalità della stringa.

2

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

2

Prova questo aiuterà controllare sia il formato della data e verificare se la data, se valido o meno:

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