2012-03-28 21 views
5

Ben de, kredi kartı son kullanma tarihlerini (yyyy-AA biçimleri) Nedensephp preg_match Bir tarih biçimi "yyyy-AA"

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

maç için preg_match: check birthday format (dd/mm/yyyy) bir modifiye emprenye biçimini kullanmaya çalışıyorum 20111-02 (geçersiz yıl) gibi geçersiz değerleri doğrulayın. Burada yanlış olan ne yapıyorum? Ben yıl 4 hanedir teyit etmek istiyorum ve ay 2 basamak (01, 02 .. 12)

cevap

9

Çapa sizin regexp'in: o "20111-02" nin "0111-02" alt dize eşleşir nedeniyle beklediğinizden yapmadım

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

Sizin regexp'in.

Anchors^ ve $ maç giriş dize içinde belirli pozisyonları: ^ dize başlangıcını eşleşir ve $ karşılaşmaları sona erdi.

Ayrıca, []'da yalnızca özel bir işlevi olduğundan, tire dışına çıkmaya gerek olmadığını unutmayın.

4

Kullanım ^ ve $ çapalar geçerli:

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

bütün dize deseni ile eşleşen sağlamak için.

Örneğinizde 20111-02, 20111-02'un 20111-02 bölümüyle eşleştiğinden eşleşiyor.

2

0111-02 ile eşleşiyor.

Değişimi:

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

için: dizesinin tamamı karşı

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

yüzden sadece denetler.

2

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

2

hem tarih biçimini kontrol ve tarih olmadığını kontrol yardımcı olacak bu deneyin geçerli olmadığı:

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