2012-05-21 27 views
39

के साथ मान्य दिनांक है, मैं एक स्क्रिप्ट पर काम कर रहा हूं जो CSV फ़ाइल से कुछ डेटा आयात करेगा। जैसा कि मैं यह कर रहा हूं, मैं यह देखने के लिए एक वैरिएबल जांचने में सक्षम होना चाहता हूं कि यह वैध दिनांक स्ट्रिंग है या नहीं।जांचें कि क्या चर PHP

मैंने यह जांचने के कई तरीके देखे हैं कि स्टिंग एक तारीख है या नहीं, लेकिन उनमें से अधिकांश को अब प्रारूप के लिए आवश्यकता है। मैं प्रारूप उस तारीख में।

अभी मैं strtotime() का उपयोग कर रहा होगा पता नहीं होगा, लेकिन यह करने के लिए आसानी से विफल रहता है

$field ="May"; 
if(strtotime($field)){ 
    echo "This is a date"; 
} 

इस मामले में, "मई" व्यक्तियों पहला नाम था, और बिल्कुल एक तारीख नहीं है।

क्या कोई भी अधिक विश्वसनीय कार्य की सिफारिश कर सकता है?

आप में से कुछ के प्रश्नों के आधार पर संपादित करें।

मेरे मामले में "दिनांक" के रूप में पास करने के लिए एक चर के लिए, इसे एक दिन/महीने/वर्ष के लिए विशिष्ट होना आवश्यक है, इसलिए केवल "मई" गिनने के लिए अस्पष्ट होगा।

कि और पॉल्स अच्छा बिंदु से नीचे हम भी इस तरह के रूप

$field ="May"; 
if(strtotime($field) && 1 === preg_match('~[0-9]~', $field)){ 
    echo "This is a date"; 
}else{ 
    echo "Nope not a date"; 
} 

यह मेरा तत्काल जरूरतों को कवर करने के लिए लगता है देखने के लिए अगर स्ट्रिंग एक नंबर शामिल परीक्षण कर सकते हैं, लेकिन यह कर सकते हैं किसी भी एक स्थान किसी भी मुद्दे या के आधार पर सुधार का सुझाव है?

+0

आपकी स्क्रिप्ट कैसे बताएगी कि 'मई' नाम या दिनांक था या नहीं? – lonesomeday

+2

आपको * कुछ * विनिर्देशों को देने की आवश्यकता है कि आप किस प्रकार के मूल्य स्वीकार करते हैं। अन्यथा "मई" किसी अन्य मूल्य के जितना अच्छा है। – JJJ

+0

जांचें कि क्या व्यक्ति का अंतिम नाम – Joelmob

उत्तर

5

मुझे नहीं लगता कि इस समस्या का एक-एक जवाब है। आपके उपयोग के मामले के आधार पर आपके पास अलग-अलग रणनीति हो सकती है।

आपका strtotime() एक आदर्श समाधान है, लेकिन जैसा कि आप कहते हैं, आप झूठी सकारात्मक के साथ समाप्त हो सकते हैं। क्यूं कर? क्योंकि एक शब्द या नाम हो सकता है। हालांकि, strtotime('May') का नतीजा क्या है?

echo date(DateTime::ISO8601, strtotime('May')); 
2012-05-21T00:00:00+0200 

तो केवल महीना देने से चालू वर्ष की तारीख और वर्तमान दिन मध्यरात्रि में दिए गए महीने के साथ शुरू हो जाएगा। एक संभावित समाधान यह जांचना होगा कि क्या आपकी स्ट्रिंग का वर्तमान दिन और/या वर्तमान वर्ष शामिल है, इस तरह, आप यह सुनिश्चित करने के लिए जांच सकते हैं कि आपकी तिथि पूरी तरह से योग्य तिथि और मान्य है।

echo date(DateTime::ISO8601, strtotime('May Day')); // (strtotime() returns false) 
1970-01-01T01:00:00+0100 

echo date(DateTime::ISO8601, strtotime('May 21')); 
2012-05-21T00:00:00+0200 

एक साधारण strpos() या यहां तक ​​कि एक regex चाल करना चाहिए।

हालांकि यह थोड़ा अजीब है और इसका उपयोग केवल तभी किया जाना चाहिए जब आपके पास कोई अन्य तरीका न हो।

मेरा मानना ​​है कि एक बेहतर समाधान मान्य प्रारूप के एक सेट को परिभाषित करना होगा और यह सुनिश्चित करने के लिए परिणाम को अलग करना होगा कि तिथि मान्य है।

$validDateFormatPatterns = array(
'[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}', // 21-05-2012, obviously this pattern is simple and would accept 05-21-2012, 
'the [0-9]{1,2}(th|st|nd|rd) (January|February|...|May|...|December) [0,9]{4}', // The 21st May 2012 
); 

आप मामले के सबसे को कवर करने की कोशिश करनी चाहिए और मुझे यकीन है कि आप regex कि सबसे वर्तमान दिनांक स्वरूप की जांच करता है खोजने के लिए सक्षम हो जाएगा हूँ।

किसी भी मामले में, आपको समय-समय पर अपने फ़ंक्शन को अनुकूलित करने की आवश्यकता हो सकती है क्योंकि इसे बुलेटप्रूफ बनाने का कोई आसान तरीका नहीं है।

56

उपयोग date_parse और लौट आए सरणी

$date = date_parse("May") 

// ["year"] == FALSE 
// ["month"] == 5 
// ["day"] == FALSE 

के मूल्यों तुम भी checkdate में उन पारित कर सकते हैं की जाँच करें।

$date = date_parse($someString); 
if ($date["error_count"] == 0 && checkdate($date["month"], $date["day"], $date["year"])) 
    echo "Valid date"; 
else 
    echo "Invalid date"; 
+0

मुझे लगता है कि आपको यह मिल गया है ... क्या कोई इस के साथ कोई दोष देख सकता है? – Alex

+0

एक छोटी सी दोष: 'date_parse' 'strtotime' पार्सिंग नियमों का उपयोग करती है, जो [अच्छी तरह परिभाषित लेकिन परिष्कृत] (http://www.php.net/manual/en/datetime.formats.php) हैं। डेटा जमा करना संभव है जो कानूनी तारीख देता है लेकिन वह इरादा नहीं था। – Charles

+2

@ चार्ल्स इनपुट के लिए एक अच्छी तरह से परिभाषित प्रारूप की आवश्यकता के बिना, स्वचालित रूप से किसी तारीख को पार्स करने के लिए किसी भी एल्गोरिदम में समस्याएं – saluce

0

मैं जानता हूँ कि यह एक लंबे समय पहले कहा गया था, लेकिन इस के लिए चारों ओर देख और regex से बचने की कोशिश, मैं इस के साथ आया था:

function checkInputIsDate($date) { 
    return (bool)strpbrk($date,1234567890) && strtotime($date); 
} 

यह काम करता है क्योंकि यह मुद्दों तैनात दूर ले जाता उपरोक्त के साथ स्ट्रिंग में संख्याएं हैं और strtotime की तारीख को आउटपुट करने के साथ-साथ यह सुनिश्चित करके केवल एक महीने strtotime में पारित किया गया है।

और एक ऐसे फ़ंक्शन के बारे में सीखा जो मुझे नहीं पता था।

उम्मीद है कि यह किसी की मदद करेगा।

संबंधित मुद्दे