2012-03-28 39 views
5

Tôi đang cố gắng sử dụng một định dạng preg sửa đổi từ preg_match: check birthday format (dd/mm/yyyy) để phù hợp với ngày hết hạn thẻ tín dụng (định dạng yyyy-MM)php preg_match định dạng ngày "yyyy-MM"

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

Đối với một số lý do, nó cũng xác thực các giá trị không hợp lệ như 20111-02 (năm không hợp lệ). Tôi đang làm gì sai ở đây? Tôi muốn khẳng định năm nay là 4 chữ số và tháng là 2 chữ số (01, 02 .. 12)

Trả lời

9

Neo regexp của bạn:

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

regexp của bạn không làm những gì bạn mong đợi vì nó phù hợp với "0111-02" chuỗi con của "20.111-02".

Anchors^$ trận đấu vị trí đặc biệt trong chuỗi đầu vào: ^ phù hợp với đầu của chuỗi và $ phù hợp cuối cùng.

Cũng lưu ý rằng không cần thoát khỏi dấu nối vì nó chỉ có chức năng đặc biệt trong [].

4

Sử dụng ^$ neo:

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

để đảm bảo toàn bộ chuỗi phù hợp với mô hình.

Trong ví dụ 20111-02 của bạn vì khớp với phần 0111-02 của 20111-02.

2

Nó phù hợp với 0111-02, phù hợp với yêu cầu của bạn.

Thay đổi:

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

tới:

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

vì vậy nó chỉ kiểm tra đối với toàn bộ chuỗi.

2

thử điều này: if (!preg_match('/^([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) {

2

Hãy thử điều này nó sẽ giúp kiểm tra cả hai định dạng ngày và kiểm tra xem ngày nếu hợp lệ hay không:

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