2012-03-28 20 views
5

Estoy tratando de utilizar un formato modificado de preg preg_match: check birthday format (dd/mm/yyyy) para que coincida con las fechas de caducidad de tarjetas de crédito (formatos aaaa-MM)PHP preg_match un formato de fecha "aaaa-MM"

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

Por alguna razón, también validar valores no válidos como 20111-02 (año no válido). ¿Qué estoy haciendo mal aquí? Quiero confirmar el año es de 4 dígitos y el mes es de 2 dígitos (01, 02 .. 12)

Respuesta

9

ancla su expresión regular:

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

Su expresión regular no hizo lo que se esperaba, ya que coincide con "0111-02" subcadena de "20111-02".

Anchors^ y $ partido posiciones particulares dentro de la cadena de entrada: ^ coincide con el comienzo de la cadena y $ coincide con el final.

Tenga en cuenta también que no hay necesidad de escapar del guión ya que solo tiene una función especial en [].

4

Use ^ y $ anclas:

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

para asegurar toda la cadena coincide con el patrón.

En su ejemplo 20111-02 coincide porque coincide con la parte 0111-02 de 20111-02.

2

Coincide con 0111-02, que se adapte a sus necesidades.

Cambio:

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

a:

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

por lo que sólo los controles contra la totalidad de la cadena.

2

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

2

Prueba esto va a ayudar a comprobar tanto en formato de fecha y comprobar si la fecha si es válido o no:

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