2012-03-28 18 views
5

मैं, क्रेडिट कार्ड समाप्ति तिथियों (YYYY-MM प्रारूपों)php preg_match एक दिनांक स्वरूप "yyyy-MM"

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

किसी कारण से मेल करने के लिए preg_match: check birthday format (dd/mm/yyyy) से एक संशोधित preg स्वरूप का उपयोग करने की कोशिश कर रहा हूँ यह भी 20111-02 (अमान्य वर्ष) जैसे अमान्य मान मान्य करें। मैं यहाँ क्या गलत कर रहा हूँ? मुझे यह बताते हुए वर्ष 4 अंक चाहते हैं और महीने के 2 अंक (01, 02 .. 12)

उत्तर

9

एंकर अपने regexp:

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

आपका regexp जिसकी आपको उम्मीद है क्योंकि यह मेल खाता है "0111-02" "20,111-02" की सबस्ट्रिंग नहीं किया।

Anchors^ और $ मैच इनपुट स्ट्रिंग के भीतर विशेष पदों: ^ स्ट्रिंग की शुरुआत से मेल खाता है और $ अंत मेल खाता है।

ध्यान दें कि हाइफ़न से बचने की कोई आवश्यकता नहीं है क्योंकि इसमें केवल [] में एक विशेष कार्य है।

4

उपयोग ^ और $ एंकर है:

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

पूरी स्ट्रिंग नमूने का मिलान सुनिश्चित करने के लिए।

आपके उदाहरण में 20111-02 मैचों में यह 20111-02 के 0111-02 भाग से मेल खाता है।

2

यह 0111-02 से मेल खाता है, जो आपकी आवश्यकताओं के अनुरूप है।

बदलें:

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

रहे हैं:

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

तो यह केवल स्ट्रिंग की सम्पूर्णता के खिलाफ जाँच करता है।

2

कोशिश यह: if (!preg_match('/^([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) {

2

यह मदद मिलेगी दोनों दिनांक स्वरूप की जाँच करें और यदि तारीख अगर जाँच की कोशिश करो वैध है या नहीं:

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'); 
} 
संबंधित मुद्दे