PHP Regex को चेक करने की तारीख YYYY-MM-DD प्रारूप में है


97

मैं यह जांचने की कोशिश कर रहा हूं कि अंतिम उपयोगकर्ताओं द्वारा दर्ज की गई तारीखें YYYY-MM-DD में हैं। रेगेक्स कभी भी मेरा मजबूत बिंदु नहीं रहा है, मुझे प्राग_मच () मेरे पास सेटअप के लिए गलत रिटर्न वैल्यू मिलती है।

इसलिए मैं मान रहा हूं कि मैंने नीचे विस्तार से रेगेक्स की गड़बड़ी की है।

$date="2012-09-12";

if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
    {
        return true;
    }else{
        return false;
    }

कोई विचार?


6
Regex किसी दिनांक को मान्य करने के लिए पर्याप्त नहीं है। रेगेक्स के बाद आपको इन दोनों में से किसी एक का भी उपयोग करना चाहिए: date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";या पीएचपी checkdate ( int $month , int $day , int $year )
Tiberiu-Ionuț स्टेन

Im इस बिंदु पर इसे मान्य करने की कोशिश नहीं कर रहा, मैं सिर्फ YYYY-MM-DD प्रारूप में यह सुनिश्चित करना चाहता हूं।
cosmicsafari

2
एक उपयोगकर्ता के लिए मान दर्ज किया गया, फॉर्म जमा करने के बाद, रेगेक्स के ठीक बाद के अन्य को मान्य करने के लिए समय में "बेहतर" क्या है (ताकि आप एक त्रुटि प्रदर्शित कर सकें)?
टिबेरिउ-आयनो स्टेन 12

फेयर पॉइंट, बाद में एक हिकूप बचा सकता है।
cosmicsafari

जवाबों:


196

इसे इस्तेमाल करे।

$date="2012-09-12";

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) {
    return true;
} else {
    return false;
}

18
return (bool)preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date);
टिबेरिउ-आयनो स्टेन 12

5
इसे सही उत्तर के रूप में क्यों चिह्नित किया गया है? यह 2016-02-30 और 2016-09-31
ग्राहम

7
यह प्रश्न दिनांक प्रारूप (YYYY-MM-DD) की जांच करने के तरीके के बारे में है, और स्वीकार किए गए उत्तर को हमेशा सबसे अच्छा उत्तर नहीं दिया जाता है, इसका मतलब यह है कि यह पूछने वाले के लिए काम करता है, इस सुंदर दौरे को पढ़ें: स्टैकओवरफ़्लो। com / दौरा
12

@ ग्राहम पुरानी पोस्ट मैं जानता हूं लेकिन स्ट्रैमिन से सहमत हूं - यह सवाल प्रारूप सत्यापन के बारे में पूछता है - वास्तविक तिथि सत्यापन नहीं
treyBake

98

इसके लिए एक और तंत्र का उपयोग करना शायद बेहतर है।

आधुनिक समाधान, के साथ DateTime:

$dt = DateTime::createFromFormat("Y-m-d", $date);
return $dt !== false && !array_sum($dt::getLastErrors());

यह इनपुट को भी मान्य $dt !== falseकरता है : यह सुनिश्चित करता है कि तारीख को निर्दिष्ट प्रारूप के साथ पार्स किया जा सकता है और यह array_sumसुनिश्चित करने का एक ट्रिक तरीका है कि PHP "महीने की शिफ्टिंग" नहीं करता (उदाहरण के लिए कि जनवरी 32 फरवरी 1 है)। DateTime::getLastErrors()अधिक जानकारी के लिए देखें ।

पुराने स्कूल समाधान के साथ explodeऔर checkdate:

list($y, $m, $d) = array_pad(explode('-', $date, 3), 3, 0);
return ctype_digit("$y$m$d") && checkdate($m, $d, $y);

यह पुष्टि करता है कि इनपुट एक मान्य तिथि है। आप ऐसा जरूर कर सकते हैं, लेकिन यह बहुत ही ज्यादा उपद्रव करने वाला है - और 29 फरवरी को रेगेक्स के साथ मान्य नहीं किया जा सकता है।

इस दृष्टिकोण का दोष यह है कि आपको किसी भी परिस्थिति में नोटिस न देते हुए सभी संभव "खराब" इनपुट को अस्वीकार करने के लिए बहुत सावधान रहना होगा। ऐसे:

  • explode 3 टोकन वापस करने के लिए सीमित है (ताकि यदि इनपुट "1-2-3-4" हो, $d "3-4" हो जाएगा)
  • ctype_digit यह सुनिश्चित करने के लिए उपयोग किया जाता है कि इनपुट में कोई गैर-संख्यात्मक वर्ण नहीं हैं (डैश के अलावा)
  • array_padउपयोग किया जाता है (एक डिफ़ॉल्ट मान के साथ जो checkdateविफल हो जाएगा) यह सुनिश्चित करने के लिए कि पर्याप्त तत्व वापस कर दिए जाएं ताकि यदि इनपुट "1-2" list()हो तो नोटिस का उत्सर्जन नहीं करेगा

+1, हमेशा इस्तेमाल किया DateTimeऔर checkdateमेरे बारे में कभी नहीं सुना ... मुझे शर्म आती है।
k102 11:21

@ k102: DateTimeयह भी कर सकता है। मैंने अभी उत्तर को समाप्त किया है, यदि आपको पसंद है तो फिर से एक बार देखिए।
जॉन

PHP मैनुअल को देखते हुए, ऐसा लगता है कि पहला समाधान अपूर्ण तिथियों को मान्य करेगा (वर्तमान तिथि से लापता मानों को भरना)।
user2428118

# 1 समाधान के साथ एक और समस्या: "गैर-अस्तित्व के मूल्यों पर रोल", उदाहरण के लिए 2001-02-31 2001-03-03 बन जाता है। (हालांकि ओपी ने स्पष्ट रूप से नहीं पूछा है कि यह संभव नहीं है।)
user2428118

1
@ user2428118: क्या आपने समाधान # 1 के रूप में दिए गए, या सिर्फ पहली पंक्ति की कोशिश की? क्या आपने दस्तावेज़ के लिए मेरे द्वारा दिए गए लिंक पर क्लिक किया getLastErrors?
जॉन

42

yyyy-mm-dd: /^((((19|[2-9]\d)\d{2})\-(0[13578]|1[02])\-(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\-(0[13456789]|1[012])\-(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\-02\-(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\-02\-29))$/g

yyyy / mm / dd: /^((((19|[2-9]\d)\d{2})\/(0[13578]|1[02])\/(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\/(0[13456789]|1[012])\/(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\/02\/(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\/02\/29))$/g

mm-dd-yyyy: /^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g

मिमी / डीडी / yyyy: /^(((0[13578]|1[02])\/(0[1-9]|[12]\d|3[01])\/((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\/(0[1-9]|[12]\d|30)\/((19|[2-9]\d)\d{2}))|(02\/(0[1-9]|1\d|2[0-8])\/((19|[2-9]\d)\d{2}))|(02\/29\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g

dd / mm / yyyy: /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g

dd-mm-yyyy: /^(((0[1-9]|[12]\d|3[01])\-(0[13578]|1[02])\-((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\-(0[13456789]|1[012])\-((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\-02\-((19|[2-9]\d)\d{2}))|(29\-02\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g


उपरोक्त सभी 1900 से 9999 तक की तारीखों के लिए काम करते हैं, जो कि उस समय की सबसे अधिक आवश्यकता होती है और मेरे प्रयास (फिर से yyyy-mm-dd प्रारूप) से 74 वर्ण कम है। यदि आप 1900 से पहले की तारीखें चाहते हैं, तो श्यजु उत्तर के लिए एक छोटा सा मोड़ 1000 वर्ष से अनुमति देगा और एक और 23 अक्षर छोटे हैं: ^ ((([1-9] \ d {3}) \ - (0 [13578]] | 1 [02]) \ - (0 [1-9] | [12] \ घ | 3 [01])) | (((19 | [2-9] \ घ) \ घ {2}) \ - ( 0 [13,456,789] | 1 [012]) \ - (0 [1-9] | [12] \ घ | 30)) | (([1-9] \ घ {3}) \ - 02 \ - (0 [1-9] | 1 \ घ | 2 [0-8])) | (([1-9] \ घ (0 [48] | [2468] [048] | [13,579] [26]) | ( (१६ | [२४६48] [०४]] [[३५ [९] [२६]] ००]) \ - ०२ \ _ -२ ९)) $
ग्राहम

36

मानदंड:

प्रत्येक वर्ष 4 से विभाज्य एक लीप वर्ष है, सिवाय इसके कि यह 100 से विभाज्य है जब तक कि यह 400 से विभाज्य न हो।

2004 - leap year - divisible by 4
1900 - not a leap year - divisible by 4, but also divisible by 100
2000 - leap year - divisible by 4, also divisible by 100, but divisible by 400

फरवरी में एक लीप वर्ष में 29 दिन होते हैं और एक लीप वर्ष में 28 नहीं होते हैं

अप्रैल, जून, सितंबर और नवंबर में 30 दिन

जनवरी, मार्च, मई, जुलाई, अगस्त, अक्टूबर और दिसंबर में 31 दिन

परीक्षा:

निम्नलिखित तिथियों को सभी सत्यापन पास करना चाहिए:

1976-02-29
2000-02-29
2004-02-29
1999-01-31

निम्नलिखित तिथियों को सभी सत्यापन विफल होना चाहिए:

2015-02-29
2015-04-31
1900-02-29
1999-01-32
2015-02-00

रेंज:

हम पहली जनवरी 1000 से 31 दिसंबर 2999 तक तारीखों के लिए परीक्षण करेंगे। तकनीकी रूप से वर्तमान में इस्तेमाल किया गया ग्रेगोरियन कैलेंडर केवल 1753 में ब्रिटिश साम्राज्य और यूरोप के देशों में 1600 के दशक में विभिन्न वर्षों में उपयोग में आया था, लेकिन मैं नहीं जा रहा हूं उस की चिंता करो।

एक लीप वर्ष के लिए परीक्षण करने के लिए Regex:

400 से विभाज्य वर्ष:

1200|1600|2000|2400|2800
can be shortened to:
(1[26]|2[048])00

if you wanted all years from 1AD to 9999 then this would do it:
(0[48]|[13579][26]|[2468][048])00
if you're happy with accepting 0000 as a valid year then it can be shortened:
([13579][26]|[02468][048])00

4 से विभाज्य वर्ष:

[12]\d([02468][048]|[13579][26])

वर्ष 100 से विभाज्य:

[12]\d00

100 से विभाज्य नहीं:

[12]\d([1-9]\d|\d[1-9])

वर्ष 100 से विभाजित लेकिन 400 से नहीं:

((1[1345789])|(2[1235679]))00

4 से विभाज्य लेकिन 100 से नहीं:

[12]\d([2468][048]|[13579][26]|0[48])

लीप वर्ष:

divisible by 400 or (divisible by 4 and not divisible by 100)
((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48])

4 से विभाज्य नहीं:

[12]\d([02468][1235679]|[13579][01345789])

एक लीप वर्ष नहीं:

Not divisible by 4 OR is divisible by 100 but not by 400
([12]\d([02468][1235679]|[13579][01345789]))|(((1[1345789])|(2[1235679]))00)

वैध माह और दिन फरवरी को छोड़कर (MM-DD):

((01|03|05|07|08|10|12)-(0[1-9]|[12]\d|3[01]))|((04|06|09|11)-(0[1-9]|[12]\d|30))
shortened to:
((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30))

28 दिनों के साथ फरवरी:

02-(0[1-9]|1\d|2[0-8])

फरवरी 29 दिनों के साथ:

02-(0[1-9]|[12]\d)

वैध तिथि:

(leap year followed by (valid month-day-excluding-february OR 29-day-february)) 
OR
(non leap year followed by (valid month-day-excluding-february OR 28-day-february))

((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8]))))

इसलिए आपके पास यह 1 जनवरी 1000 और 31 दिसंबर 2999 के बीच YYYY-MM-DD प्रारूप में दिनांक के लिए एक regex है।

मुझे संदेह है कि इसे थोड़ा छोटा किया जा सकता है, लेकिन मैं इसे किसी और को छोड़ दूंगा।

जो सभी मान्य तिथियों से मेल खाएगा। यदि आप चाहते हैं कि यह केवल तभी मान्य हो जब इसमें सिर्फ एक तिथि हो और कुछ नहीं, तो इसे इस ^( )$तरह से लपेटें :

^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$

यदि आप इसे वैकल्पिक तिथि प्रविष्टि के लिए चाहते हैं (अर्थात यह रिक्त या वैध तिथि हो सकती है) तो ^$|शुरुआत में जोड़ें , जैसे:

^$|^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|((0[469]|11)-(0[1-9]|[12]\d|30)))|(02-(0[1-9]|1\d|2[0-8])))))$

7
यह एक वीर अभिव्यक्ति है, और बहुत अच्छी तरह से समझाया गया है।
परिवेश

क्या आपके पास इस बात का पक्का सबूत है कि यह हर वैध मामले को पारित कर देगा और हर अमान्य मामले में विफल हो जाएगा?
एमडी अशरफुल इस्लाम

@ एमडी अशरफुल इस्लाम नं।
ग्राहम

@Graham Altough कोई समस्या नहीं है, हम इसे अपनी वेबसाइट में उपयोग कर रहे हैं। मुझे उम्मीद है कि कोई समस्या नहीं होगी।
एमडी अशरफुल इस्लाम

@Md अशराफुल इस्लाम - हम भी इसका इस्तेमाल करते हैं और अभी तक इससे कोई समस्या नहीं है
ग्राहम

18

आप इसे इस तरह से बना सकते हैं:

if (preg_match("/\d{4}\-\d{2}-\d{2}/", $date)) {
    echo 'true';
} else {
    echo 'false';
}

लेकिन आप इसे बेहतर उपयोग करेंगे:

$date = DateTime::createFromFormat('Y-m-d', $date);
if ($date) {
    echo $date -> format('Y-m-d');
}

इस मामले में आपको एक ऐसी वस्तु मिल जाएगी जो केवल तारों की तुलना में उपयोग करना आसान है।


1
यहाँ इस्तेमाल की जाने वाली डेटटाइम तकनीक 2016-05-44 जैसी तारीख के लिए सही होगी जो वास्तविक तारीख नहीं है
nonybrighto

यह एक अच्छा उदाहरण नहीं है, खासकर यदि आप तिथि (Ymd) प्राप्त करना चाहते हैं। उदाहरण: 0175-44-19927गुजर जाएगा।
अत्तिला नागी

7

मुझे पता है कि यह एक पुराना सवाल है। लेकिन मुझे लगता है कि मेरे पास एक अच्छा उपाय है।

$date = "2016-02-21";
$format = "Y-m-d";

if(date($format, strtotime($date)) == date($date)) {
    echo "true";
} else {
    echo "false";
}

आप इसे आज़मा सकते हैं। यदि आप दिनांक 21.02.2016 को बदल देते हैं तो प्रतिध्वनि झूठी है। और यदि आप उसके बाद प्रारूप बदलते हैं तो प्रतिध्वनित करने के लिए प्रतिध्वनि सत्य है।

इस आसान कोड के साथ आपको यह जांचने में सक्षम होना चाहिए कि किस तिथि-प्रारूप का उपयोग रेगेक्स द्वारा जाँच किए बिना किया जाता है।

हो सकता है कि कोई ऐसा व्यक्ति हो जो हर मामले पर इसका परीक्षण करेगा। लेकिन मुझे लगता है कि मेरा विचार आम तौर पर मान्य है। मेरे लिए यह तर्कसंगत लगता है।


मुझे नहीं लगता कि आपको इफ लाइन पर $ (लगभग) तारीख की आवश्यकता है। यदि (दिनांक ($ प्रारूप, स्ट्रेटोटाइम ($ तिथि)) == $ तिथि) - पर्याप्त होना चाहिए
iateadonut

7

आप चेकडैट php फ़ंक्शन के साथ preg_match का उपयोग कर सकते हैं

$date  = "2012-10-05";
$split = array();
if (preg_match ("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $split))
{
    return checkdate($split[2], $split[3], $split[1]);
}

return false;

वापसी preg_match ("/ ^ ([0-9] {4}) - ([0-9] {2}) - ([0-9] {2}) $ /", $ तारीख, $ विभाजन) && चेकडेट ($ विभाजन [2], $ विभाजन [3], $ विभाजित [1]);
तिबरियू-आयनो स्टेन 12

5

preg_match को एक / या दूसरे चार्ट को सीमांकक की आवश्यकता होती है।

preg_match("/^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$/",$date)

आपको उस तिथि की वैधता की भी जांच करनी चाहिए ताकि आप 9999-19-38 जैसी किसी चीज़ के साथ समाप्त न हों

bool checkdate ( int $month , int $day , int $year )

3

आप इसे इस तरह भी कर सकते हैं:

if (DateTime::createFromFormat('Y-m-d', $date)->format('Y-m-d') === $date) {

    // date is correctly formatted and valid, execute some code

}

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


3

आप उपयोग कर सकते हैं

function validateDate($date, $format = 'Y-m-d H:i:s')
{
    $d = DateTime::createFromFormat($format, $date);
    return $d && $d->format($format) == $date;
}

$date="2012-09-12";    
echo validateDate($date, 'Y-m-d'); // true or false

2

जाँच करें और सत्यापित करें 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;
}

आउटपुट होगा:

var_dump(isValidDate("2018-01-01")); // bool(true)
var_dump(isValidDate("2018-1-1"));   // bool(true)
var_dump(isValidDate("2018-02-28")); // bool(true)
var_dump(isValidDate("2018-02-30")); // bool(false)

प्रमुख शून्य के बिना दिन और महीने की अनुमति है। यदि आप इसकी अनुमति नहीं देना चाहते हैं, तो regexp होना चाहिए:

"/^(\d{4})-(\d{2})-(\d{2})$/"

1

यदि आप उस प्रकार की तारीख से मेल खाना चाहते हैं, तो उपयोग करें:

preg_match("~^\d{4}-\d{2}-\d{2}$~", $date)

1

यह आपको बताना चाहिए कि क्या प्रारूप वैध है और यदि इनपुट तिथि वैध है।

    $datein = '2012-11-0';

    if(preg_match('/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/', $datein)){
        echo 'good';
    }else{
        echo 'no good';
    }

1

यदि यह किसी भी मदद का है, तो यहाँ jnY प्रारूप के लिए एक regex है (वर्ष 2018 से अधिक होना चाहिए):

if (preg_match('/^([1-9]|[1-2][0-9]|[3][0-1])\-([1-9]|[1][0-2])\-(?:20)([1][8-9]|[2-9][0-9])$/', $date)) {
   // Do stuff
}

1

प्रारूप 1: $ format1 = "2012-12-31";

प्रारूप 2: $ स्वरूप 2 = "31-12-2012";

if (preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$format1)) {
    return true;
} else {
    return false;
}

if (preg_match("/^(0[1-9]|[1-2][0-9]|3[0-1])-(0[1-9]|1[0-2])-[0-9]{4}$/",$format2)) {
    return true;
} else {
    return false;
}

1

शायद किसी के लिए उपयोगी:

$patterns = array(
            'Y'           =>'/^[0-9]{4}$/',
            'Y-m'         =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])$/',
            'Y-m-d'       =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])(-|\/)([1-9]|0[1-9]|[1-2][0-9]|3[0-1])$/',
            'Y-m-d H'     =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])(-|\/)([1-9]|0[1-9]|[1-2][0-9]|3[0-1])\s(0|[0-1][0-9]|2[0-4])$/',
            'Y-m-d H:i'   =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])(-|\/)([1-9]|0[1-9]|[1-2][0-9]|3[0-1])\s(0|[0-1][0-9]|2[0-4]):?(0|[0-5][0-9]|60)$/',
            'Y-m-d H:i:s' =>'/^[0-9]{4}(-|\/)([1-9]|0[1-9]|1[0-2])(-|\/)([1-9]|0[1-9]|[1-2][0-9]|3[0-1])\s(0|[0-1][0-9]|2[0-4]):?((0|[0-5][0-9]):?(0|[0-5][0-9])|6000|60:00)$/',
        );
echo preg_match($patterns['Y'], '1996'); // true
echo preg_match($patterns['Y'], '19966'); // false
echo preg_match($patterns['Y'], '199z'); // false
echo preg_match($patterns['Y-m'], '1996-0'); // false
echo preg_match($patterns['Y-m'], '1996-09'); // true
echo preg_match($patterns['Y-m'], '1996-1'); // true
echo preg_match($patterns['Y-m'], '1996/1'); // true
echo preg_match($patterns['Y-m'], '1996/12'); // true
echo preg_match($patterns['Y-m'], '1996/13'); // false
echo preg_match($patterns['Y-m-d'], '1996-11-1'); // true
echo preg_match($patterns['Y-m-d'], '1996-11-0'); // false
echo preg_match($patterns['Y-m-d'], '1996-11-32'); // false
echo preg_match($patterns['Y-m-d H'], '1996-11-31 0'); // true
echo preg_match($patterns['Y-m-d H'], '1996-11-31 00'); // true
echo preg_match($patterns['Y-m-d H'], '1996-11-31 24'); // true
echo preg_match($patterns['Y-m-d H'], '1996-11-31 25'); // false
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 2400'); // true
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:00'); // true
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:59'); // true
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:60'); // true
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:61'); // false
echo preg_match($patterns['Y-m-d H:i'], '1996-11-31 24:61'); // false
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:6000'); // true
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:60:00'); // true
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:59:59'); // true
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:59:60'); // false
echo preg_match($patterns['Y-m-d H:i:s'], '1996-11-31 24:60:01'); // false

'1996-11-31 24:00'); // true, वास्तव में? इसके अलावा, कभी कभी एक मिनट में 61 सेकंड है, देखें: en.wikipedia.org/wiki/Leap_second
टोटो

1

सामान्य तिथि प्रारूप को मान्य करने का कार्य:

function validateDate($date, $format = 'Y-m-d') {
  $d = DateTime::createFromFormat($format, $date);
  return $d && $d->format($format) == $date;
}

निष्पादन का उदाहरण:

var_dump(validateDate('2021-02-28')); // true
var_dump(validateDate('2021-02-29')); // false

कृपया अपना उत्तर हमेशा केवल कोड चिपकाने के बजाय संदर्भ में रखें। अधिक जानकारी के लिए यहां देखें । कृपया
मार्कडाउन

0

यह सब इस बात पर निर्भर करता है कि आप इस फ़ंक्शन को कितना सख्त चाहते हैं। उदाहरण के लिए, यदि आप 12 से ऊपर के महीनों और 31 से ऊपर के दिनों की अनुमति नहीं देना चाहते हैं (महीने के आधार पर नहीं, इसके लिए तारीख-तर्क लिखने की आवश्यकता होगी), तो यह बहुत जटिल हो सकता है:

function checkDate($date)
{
  $regex = '/^' . 
    '(' .

    // Allows years 0000-9999
    '(?:[0-9]{4})' .
    '\-' .

    // Allows 01-12
    '(?:' .
    '(?:01)|(?:02)|(?:03)|(?:04)|(?:05)|(?:06)|(?:07)|(?:08)|(?:09)|(?:10)|' .
    '(?:11)|(?:12)' .
    ')' .
    '\-' .

    // Allows 01-31
    '(?:' .
    '(?:01)|(?:02)|(?:03)|(?:04)|(?:05)|(?:06)|(?:07)|(?:08)|(?:09)|(?:10)|' .
    '(?:11)|(?:12)|(?:13)|(?:14)|(?:15)|(?:16)|(?:17)|(?:18)|(?:19)|(?:20)|' .
    '(?:21)|(?:22)|(?:23)|(?:24)|(?:25)|(?:26)|(?:27)|(?:28)|(?:29)|(?:30)|' .
    '(?:31)' .
    ')' .

    '$/';

  if ( preg_match($regex, $date) ) {
    return true;
  }

  return false;
}

$result = checkDate('2012-09-12');

व्यक्तिगत रूप से मैं सिर्फ इसके लिए जाऊंगा: /^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/


4
यह रेगेक्स अनावश्यक रूप से जटिल है। 0[1-9]|1[0-2]मैच का महीना 01-12 और 0[1-9]|[12][0-9]|3[01]मैच का दिन 01-31 है।
एस्ट्रार

जब मैं उल्टी करता हूं तो क्षमा करें
AlxVallejo

0

Php में तारीखों के साथ काम करने के लिए आपको php मानक का पालन करना चाहिए ताकि दिए गए rexx यह आश्वस्त करें कि आपके पास वैध दिनांक है जो PHP के साथ काम कर सकता है।

    preg_match("/^([0-9]{4})-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)

आपका rgex गलत है, यह मेल नहीं खाएगा 1980-01-01लेकिन मैच करेगा2100-02-29
Toto

0

यह विधि PHP में तारीख को मान्य करने के लिए उपयोगी हो सकती है। वर्तमान विधि mm / dd / yyyy प्रारूप के लिए है। आपको अपने प्रारूप के अनुसार चेकडैट में पैरामीटर अनुक्रम को अपडेट करना होगा और विस्फोट में सीमांकक करना होगा ।

    function isValidDate($dt)
    {
        $dtArr = explode('/', $dt);
        if (!empty($dtArr[0]) && !empty($dtArr[1]) && !empty($dtArr[2])) {
            return checkdate((int) $dtArr[0], (int) $dtArr[1], (int) $dtArr[2]);
        } else {
            return false;
        }
    }

0

[यदि आप सिम्फनी 4.1.2 का उपयोग करते हैं तो यह कोशिश करें] [1]

  $validDate = explode("-",$request->get('date'));
        if (checkdate(filter_var($validDate[1],FILTER_SANITIZE_NUMBER_INT),filter_var($validDate[0],FILTER_SANITIZE_NUMBER_INT),filter_var($validDate[2],FILTER_SANITIZE_NUMBER_INT))){
            $date = date_create(filter_var($request->get('date'),FILTER_SANITIZE_SPECIAL_CHARS));
        }else{
            return $this->redirectToRoute('YOUR_ROUTE');
        }

0

लारवेल 5.7 और दिनांक प्रारूप से: 12/31/2019

function checkDateFormat(string $date): bool
{
    return preg_match("/^(0[1-9]|1[0-2])\/(0[1-9]|[1-2][0-9]|3[0-1])\/[0-9]{4}$/", $date);
}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.