2013-11-04 7 views
7

के रूप में प्रारूप का उपयोग करके PHP में दिनांक को सत्यापित करने के लिए मैं एक तारीख regex सत्यापनकर्ता बनाने की कोशिश कर रहा हूं। मेरे पास जो मुद्दा है वह यह है कि मैं "date" प्रकार के साथ एक इनपुट फ़ील्ड का उपयोग कर रहा हूं, जो क्रोम में एक आकर्षण की तरह काम करता है; यह क्रोम में कैलेंडर की तरह खुलता है, लेकिन बाकी में यह कुछ भी नहीं करता है, इसलिए मैंने बाकी के लिए तारीख के मैन्युअल इनपुट के लिए जाने का फैसला किया।Regex को YYYY-MM-DD

यह मेरी त्रुटि फेंक संदेश (मैं YYYY-MM-DD स्वरूप के लिए देख रहा हूँ) है:

$date_regex ='#^(19|20)\d\d[\- /.](0[1-9]|1[012])[\- /.](0[1-9]|[12][0-9]|3[01])$#'; 
$hiredate = $_POST['hiredate']; 
if (!preg_match($date_regex, $hiredate)){ 
    $errors[] = 'Your hire date entry does not match the YYYY-MM-DD required format.'; 
} 

मैं जानता हूँ कि इस बारे में उदाहरण के एक बहुत देखते हैं, लेकिन मैं पहले से ही है और मैं 20 की तरह करने की कोशिश की इसे हल नहीं कर सका। शायद मुझे कुछ याद आ रही है।

यहाँ, इनपुट क्षेत्र है कि अगर कुछ हद तक प्रासंगिक:

<input type="date" name="hiredate" /> 
+1

क्यों विस्फोट नहीं करते - और इसके बजाय चेकडेट() का उपयोग करें? –

+0

क्या कोई मानक प्रक्रिया है? मैंने इसे एक अलग पोस्ट में पाया लेकिन मेरे लिए काम नहीं किया। एफवाईआई, मैं उन्हें YYYY/MM/DD या YYYY.MM.DD या YYYY-MM-DD जैसे डालने देना चाहता हूं। उन्हें बहुत ज्यादा रोकने के लिए। – Cataneo

+3

क्या 3 अलग-अलग '' बॉक्स को उपयुक्त अधिकतम लम्बाई और अंक-केवल वैधता प्रदान करना आसान होगा जो बैकएंड पर उचित प्रारूप में सम्मिलित हो जाता है? यदि कोई व्यक्ति 'कुंजी दबाए गए' 2 अंकों पर आप अगले इनपुट पर जाने के लिए श्रोताओं को प्रत्येक इनपुट बॉक्स में जोड़ सकते हैं। उपयोगकर्ता आपको किस प्रारूप के बारे में एक चूहों को पीछे नहीं देता है और आप उन्हें केवल तभी निराश करेंगे यदि यह उनके व्यक्तिगत मूल प्रारूप – MonkeyZeus

उत्तर

10

आपका रेगेक्स काम नहीं करता है क्योंकि आपके पास / डिलीमीटर से अनचाहे था।

regex कि प्रारूप YYYY-MM-DD में तारीख को मान्य देंगी:

^(19|20)\d\d[\-\/.](0[1-9]|1[012])[\-\/.](0[1-9]|[12][0-9]|3[01])$ 

यह मान्य करेगा उस वर्ष, 19 या 20 के साथ शुरू होता है कि महीने के 12 से बड़ा नहीं है और बराबर नहीं है 0 और कि दिन 31 से अधिक नहीं है और 0 के बराबर नहीं है।

Example Online

अपने प्रारंभिक उदाहरण का उपयोग करना, आप इस तरह यह परीक्षण कर सकते हैं:

$date_regex = '/^(19|20)\d\d[\-\/.](0[1-9]|1[012])[\-\/.](0[1-9]|[12][0-9]|3[01])$/'; 
$hiredate = '2013-14-04'; 

if (!preg_match($date_regex, $hiredate)) { 
    echo '<br>Your hire date entry does not match the YYYY-MM-DD required format.<br>'; 
} else { 
    echo '<br>Your date is set correctly<br>';  
} 

Example Online

+1

हाँ का उपयोग करना होगा, यह ठीक काम करता है। मैंने रेगेक्स के इतने सारे रूपों का उपयोग किया था, मैंने इसे बुरी तरह बदल दिया होगा। बड़ी आंखें आपके पास इलिया रोस्तोवत्सेव हैं। – Cataneo

13

इस के लिए regex का उपयोग न करें, आप आप यहाँ और अधिक पढ़ सकते DateTime::createFromFormat

// specify your date's original format, in this example m/d/Y (e.g. 08/31/2013) 
$format = "m/d/Y"; 
$hireDate = DateTime::createFromFormat($format, $_POST['hiredate']); 
if(!$hireDate) { 
// createFromFormat returns false if the format is invalid; 
} else { 
    //change it to any format you want with format() (e.g. 2013-08-31) 
    echo $hireDate->format("Y-m-d"); 
} 

उपयोग करके एक ही परिणाम प्राप्त कर सकते हैं:

http://php.net/manual/en/datetime.createfromformat.php

हो बुखार, ऐसा लगता है कि यह मुद्दा PHP से पूरी तरह से असंबंधित है।

PHP बैक एंड पर चलता है, और ऐसा लगता है कि आपके सामने फ्रंट एंड समस्या है।

मुझे यह भी संदेह है कि समस्या आपके द्वारा उपयोग किए जाने वाले इनपुट प्रकार है। यदि कोई ब्राउज़र आपके द्वारा निर्दिष्ट इनपुट प्रकार का समर्थन नहीं करता है, तो यह टेक्स्ट पर डिफ़ॉल्ट होता है। इसे यहाँ देखें:

http://jsfiddle.net/FKGCA/

मेरे ब्राउज़र पता नहीं है क्या <input type="whatever" /> है, इसलिए यह चूक "पाठ" के लिए इनपुट प्रकार। अगर मैं <form action="myForm.php" method="POST"></form> टैग में उन 4 इनपुट को लपेटता हूं, तो ब्राउज़र सर्वर पर इनपुट भेजता है क्योंकि सर्वर परवाह नहीं है/पता है कि इनपुट छिपे हुए हैं, रेडियो बटन, चयन, ग्रंथ या पासवर्ड। सर्वर केवल कच्चे डेटा प्राप्त करता है।

संभावना से अधिक, आपकी समस्या आपके जावास्क्रिप्ट के साथ है, न कि आपके PHP के साथ। यह देखने का प्रयास करें कि क्या ब्राउज़र आपके विजेट को प्रदर्शित नहीं करता है, आपको बताता है कि आपके पृष्ठ में किसी प्रकार की त्रुटि है।

सफारी और फ़ायरफ़ॉक्स में विकास/डिबगिंग उपकरण हैं, आईई के बारे में इतना निश्चित नहीं है।

+0

वही था जो मैं बता रहा था। "विजेट" क्रोम में काम करता है और दूसरों में एक टेक्स्ट इनपुट प्रकार में परिवर्तित हो जाता है। यही वही है जो मैं सत्यापित करने की कोशिश कर रहा हूं। मेरे पास तिथि प्रारूप है और क्षेत्र को तीन में विभाजित किया गया है और वहां से चलेगा। – Cataneo

+1

गॉचा, इस तरह के मामलों के लिए जब jQuery आसान काम में आता है। अन्यथा, आपको समर्थन के लिए परीक्षण करने की आवश्यकता होगी: http://diveintohtml5.info/detect.html#input-types और यदि यह समर्थित नहीं है। आपको जावास्क्रिप्ट-आधारित विकल्पों (जैसे jQuery) – ILikeTacos

0

चेक और मान्य YYYY-MM-DD एक पंक्ति बयान में तारीख

function isValidDate($date) { 
    return preg_match("/^(\d{4})-(\d{1,2})-(\d{1,2})$/", $date, $m) 
     ? checkdate(intval($m[2]), intval($m[3]), intval($m[1])) 
     : false; 
} 

देखें विवरण मेरे उत्तर में here

तिथियों को सत्यापित करने के लिए अंधेरे DateTime::createFromFormat का उपयोग न करें। के न के बराबर तारीख ले 2018-02-30 हैं और देखते हैं:

$d = DateTime::createFromFormat("Y-m-d", "2018-02-30"); 
var_dump((bool) $d); // bool(true) 

हाँ, यह रिटर्न true, नहीं false के रूप में आप की उम्मीद कर सकते हैं। अधिक दिलचस्प:

$d = DateTime::createFromFormat("Y-m-d", "2018-99-99"); 
var_dump((bool) $d); // bool(true) 

इसके अलावा true ... तो, यह सिर्फ अंकों की संख्या की पुष्टि करता है। एक और प्रयास करें:

$d = DateTime::createFromFormat("Y-m-d", "ABCD-99-99"); 
var_dump($d); // bool(false) 

अंतिम false पर।

क्या यहाँ हम इस स्निपेट से देख सकते हैं पर जा रहा है:

$d = DateTime::createFromFormat("Y-m-d", "2018-02-30"); 
var_dump($d); 

// var_dump OUTPUT 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(26) "2018-03-02 16:41:34.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(3) "UTC" 
} 

आप जब हम न के बराबर 2018-02-30 पारित देख सकते हैं, DateTime वस्तु 2018-03-02 शामिल हैं। मुझे लगता है कि ऐसा इसलिए है क्योंकि फरवरी 2018 में 28 दिन हैं, यानी अधिकतम तिथि 2018-02-28 है, और जब हम दिन 30 पास करते हैं, तो बनाएं FromFormat 2018-02-01 पर केवल 30 दिन जोड़ता है और बिना किसी पूर्व दिनांक सत्यापन के नए दिनांक बना देता है।