পিএইচপি রেগেক্স চেক করার তারিখটি ওয়াইওয়াইওয়াই-এমএম-ডিডি ফর্ম্যাটে রয়েছে


101

আমি শেষ ব্যবহারকারীদের দ্বারা প্রবেশের তারিখগুলি YYYY-MM-DD এ রয়েছে তা যাচাই করার চেষ্টা করছি। Regex কখনই আমার দৃ point় পয়েন্ট ছিল না, আমি সেটআপ করা প্রিগ_ম্যাচ () এর জন্য একটি মিথ্যা রিটার্ন মান পেতে থাকি।

সুতরাং আমি ধরে নিচ্ছি যে আমি নীচে বিস্তারিত রেগেক্সের একটি জগাখিচুড়ি করেছি

$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
রেগেক্স কোনও তারিখ বৈধ করার জন্য যথেষ্ট নয়। রেজেক্সের পরে আপনার এই দুটিগুলির একটি ব্যবহার করা উচিত: date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";বা পিএইচপি'র checkdate ( int $month , int $day , int $year )
টিবিরিউ-আয়নু স্টান

আমি এই মুহুর্তে এটি যাচাই করার চেষ্টা করছি না, আমি কেবল এটি YYYY-MM-DD ফর্ম্যাটে নিশ্চিত করতে চাই।
মহাজাগতিক সাফারি

4
কোনও ব্যবহারকারীর মূল্য প্রবেশ করানোর জন্য, ফর্ম জমা দেওয়ার সময় সঠিকভাবে রেগেক্সের পরে অন্যটি বৈধ করার জন্য "পয়েন্ট" এর চেয়ে ভাল আর কী হতে পারে (যাতে আপনি কোনও ত্রুটি প্রদর্শন করতে পারেন)?
টিবেরিউ-আয়নু স্টান

ফেয়ার পয়েন্ট, পরে একটি হিকআপ সংরক্ষণ করতে পারে।
মহাজাগতিক সাফারি

উত্তর:


203

এটা চেষ্টা কর.

$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);
টিবেরিউ-আয়নু স্টান

5
কেন এটি সঠিক উত্তর হিসাবে চিহ্নিত হয়েছে? এটি 2016-02-30 এবং 2016-09-31
গ্রাহাম

7
এই প্রশ্নটি কীভাবে একটি তারিখের ফর্ম্যাট (YYYY-MM-DD) চেক করতে হবে এবং স্বীকৃত হিসাবে চিহ্নিত উত্তরটি সর্বদা সেরা উত্তর নয়, এর অর্থ কেবল এটি যে সেই ব্যক্তিটির জন্য কাজ করেছিল যা এই সুন্দর ভ্রমণটি পড়বে: স্ট্যাকওভারফ্লো। কম / ট্যুর
স্ট্রমিন

@ গ্রাহাম পুরাতন পোস্টটি আমি জানি তবে স্ট্র্যামিনের সাথে একমত - এই প্রশ্নটি ফর্ম্যাটের বৈধতা সম্পর্কে জিজ্ঞাসা করে - আসল তারিখের বৈধতা নয়
ট্রেবেক

100

এটির জন্য সম্ভবত অন্য একটি পদ্ধতি ব্যবহার করা ভাল।

আধুনিক সমাধান, সাথে DateTime:

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

এটি ইনপুটটিকেও বৈধতা দেয়: $dt !== falseনিশ্চিত করে যে তারিখটি নির্দিষ্ট ফর্ম্যাট দিয়ে পার্স করা যায় এবং array_sumকৌশলটি পিএইচপি "মাস শিফটিং" করেনি তা নিশ্চিত করার একটি ক্ষুদ্র উপায় eg দেখুন 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);

এটি বৈধতা দেয় যে ইনপুটটিও একটি বৈধ তারিখ। আপনি অবশ্যই এটি একটি রেজেক্সের সাহায্যে করতে পারেন, তবে এটি আরও গোলমাল হতে চলেছে - এবং ২৯ শে ফেব্রুয়ারিকে কোনও রেজেক্সের সাথে মোটেও বৈধতা দেওয়া যায় না।

এই পদ্ধতির অপূর্ণতা হ'ল যে কোনও পরিস্থিতিতে কোনও নোটিশ ছাড়ার সময় আপনাকে সমস্ত সম্ভাব্য "খারাপ" ইনপুটগুলি প্রত্যাখ্যান করতে খুব সতর্ক থাকতে হবে। এখানে কীভাবে:

  • explode3 টি টোকেন ফিরতে সীমাবদ্ধ (যাতে ইনপুটটি যদি "1-2-3-4" হয় তবে $d"3-4" হয়ে যাবে)
  • ctype_digit ইনপুটটিতে কোনও অ-সংখ্যাসূচক অক্ষর না রয়েছে তা নিশ্চিত করতে ব্যবহৃত হয় (ড্যাশগুলি বাদে)
  • array_padcheckdateপর্যাপ্ত উপাদানগুলি ফিরে এসেছে কিনা তা নিশ্চিত করার জন্য (ইনপুট "1-2" list()নোটিশ ছাড়বে না তা নিশ্চিত করার জন্য ব্যবহার করা হয়েছে (একটি ডিফল্ট মান সহ যা ব্যর্থ হতে পারে)

+1, সর্বদা ব্যবহৃত DateTimeএবং কখনও শুনিনি checkdate... আমাকে লজ্জা দেয়।
102

@ কে 102: DateTimeএটিও করতে পারে। আমি উত্তরটি সবেমাত্র শেষ করেছি, যদি আপনি চান তবে আবার একবার দেখুন have
জন

পিএইচপি ম্যানুয়ালটি দেখে মনে হচ্ছে প্রথম সমাধানটি অসম্পূর্ণ তারিখগুলি বৈধ করবে (বর্তমান তারিখ থেকে নিখোঁজ মানগুলি পূরণ করছে)।
ব্যবহারকারী 2428118

সমাধান # 1 সহ আরও একটি সমস্যা: "অ-অস্তিত্বের মানগুলি রোল ওভার", যেমন 2001-02-31 2001-03-03 হয়। (যদিও ওপি স্পষ্টভাবে জিজ্ঞাসা করেনি যে এটি সম্ভব নয়।)
ব্যবহারকারী 2428118

4
@ ইউজার ২৪২৮১১৮: আপনি কি সমাধান হিসাবে সমাধানের চেষ্টা করেছেন # 1 ঠিক যেমনটি দিয়েছেন, বা ঠিক প্রথম লাইন? ডকুমেন্টেশনের জন্য আমি যে লিঙ্কটি দিয়েছি তা কি আপনি ক্লিক করেছেন getLastErrors?
জোন

43

ইয়ে-মিমি-ডিডি: /^((((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

ইয়ে / মিমি / ডিডি: /^((((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

মিমি-ডিডি-ইয়েই: /^(((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

মিমি / ডিডি / ইয়াহু: /^(((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

ডিডি / মিমি / ইয়াহু: /^(((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

ডিডি-মিমি-ইয়াসি: /^(((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


উপরের সমস্তগুলি ১৯৯০০ থেকে ৯৯৯৯ তারিখের জন্য কাজ করে যা বেশিরভাগ সময় প্রয়োজন এবং এটি আমার প্রচেষ্টার চেয়ে characters৪ টি অক্ষর সংক্ষিপ্ততর (আবার ইয়েমি-মিমি-ডিডি ফর্ম্যাট)। আপনি যদি 1900-এর পূর্বের তারিখগুলি চান তবে শাইজু উত্তরের একটি সামান্য সাম্প্রতিকতা 1000 বছর থেকে মঞ্জুরি দেবে এবং এটি আরও 23 টি অক্ষর সংক্ষিপ্ত হবে: ^ ((([1-9] \ d {3})) \ - (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)) | (([1-9] \ d {3})) \ - 02 \ - (0 [1-9] | 1 \ d | 2 [0-8])) | (([[1-9] \ d (0 [48] | [2468] [048] | [13579] [26]) | ( (16 | [2468] [048] | [3579] [26]) 00)) \ - 02 \ -29)) $
গ্রাহাম

36

নির্ণায়ক:

প্রতিবছর 4 দ্বারা বিভাজ্য একটি লিপ বছর, এটি যখন 400 দ্বারা বিভাজ্য না হয় তবে 100 দ্বারা বিভাজ্য হয় So সুতরাং:

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 দিন থাকে এবং যখন লিপ বছর হয় না

এপ্রিল, জুন, সেপ্টেম্বর এবং নভেম্বর মাসে 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 তারিখের জন্য পরীক্ষা করব Techn প্রযুক্তিগতভাবে বর্তমানে ব্যবহৃত গ্রেগরিয়ান ক্যালেন্ডারটি কেবল ব্রিটিশ সাম্রাজ্যের জন্য 1753 সালে এবং ইউরোপের দেশগুলির জন্য 1600 এর দশকে বিভিন্ন ক্ষেত্রে ব্যবহৃত হয়েছিল, তবে আমি যাচ্ছি না যে সম্পর্কে চিন্তা।

লিপ বছরের জন্য পরীক্ষা করার জন্য রেজেক্স:

বছরগুলি 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)

ফেব্রুয়ারী (এমএম-ডিডি) ব্যতীত বৈধ মাস এবং দিন:

((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))

২৮ দিন সহ ফেব্রুয়ারি:

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

২৯ দিন সহ ফেব্রুয়ারি:

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 এর মধ্যে তারিখগুলির জন্য একটি রেজিেক্স রয়েছে।

আমি সন্দেহ করি যে এটি কিছুটা ছোট করা যেতে পারে তবে আমি এটি অন্য কারও কাছে ছেড়ে দেব।

এটি সমস্ত বৈধ তারিখের সাথে মিলবে। আপনি যদি এটিটি কেবলমাত্র বৈধ হতে চান যখন এটিতে কেবলমাত্র একটি তারিখ এবং অন্য কিছু থাকে না, তবে এটিকে ^( )$এমনভাবে মোড়ানো করুন :

^(((((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])))))$

আপনি যদি এটি একটি optionচ্ছিক তারিখ প্রবেশের জন্য চান (যেমন এটি ফাঁকা বা বৈধ তারিখ হতে পারে) তবে ^$|শুরুতে যুক্ত করুন, এর মতো:

^$|^(((((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])))))$

8
এটি একটি বীরত্বপূর্ণ প্রকাশ এবং খুব ভালভাবে ব্যাখ্যা করা হয়েছে।
পরিবেষ্টিত

আপনার কাছে কি দৃ strong় প্রমাণ রয়েছে যে এটি প্রতিটি বৈধ কেসটি পাস করবে এবং প্রতিটি অবৈধ মামলায় ব্যর্থ হবে?
মোঃ আশরাফুল ইসলাম

@ এমডি আশরাফুল ইসলাম নং
গ্রাহাম

@ গ্রাহাম আলট্ফের কোনও সমস্যা নেই, আমরা এটি আমাদের ওয়েবসাইটে ব্যবহার করছি। আমি আশা করি কোন সমস্যা হবে না।
মোঃ আশরাফুল ইসলাম

@ এমডি আশরাফুল ইসলাম - আমরা এটিও ব্যবহার করেছি এবং এ পর্যন্ত এটি নিয়ে কোনও সমস্যা হয়নি
গ্রাহাম

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

এক্ষেত্রে আপনি এমন একটি বস্তু পাবেন যা কেবল স্ট্রিংয়ের চেয়ে ব্যবহার করা সহজ নয়।


4
এখানে ব্যবহৃত ডেটটাইম কৌশলটি 2016-05-44 এর মতো তারিখের জন্য সত্য ফিরে আসবে যা কোন আসল তারিখ নয়
ননব্রাইটো

আপনি যদি তারিখ (ওয়াইএমডি) পেতে চান এটি বিশেষত উদাহরণ নয়। উদাহরণ: 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 তারিখে পরিবর্তন করলে প্রতিধ্বনি মিথ্যা false এবং আপনি যদি এর পরে ফর্ম্যাটটি ডিএমওয়াই করতে চান তবে প্রতিধ্বনি সত্য।

এই সহজ কোডের সাহায্যে আপনি রেজেক্স দ্বারা এটি পরীক্ষা না করে কোন তারিখ-ফর্ম্যাটটি ব্যবহার করা হচ্ছে তা পরীক্ষা করতে সক্ষম হওয়া উচিত।

হতে পারে এমন কোনও ব্যক্তি আছেন যা প্রতিটি ক্ষেত্রে এটি পরীক্ষা করবেন test তবে আমি মনে করি আমার ধারণাটি সাধারণত বৈধ। আমার কাছে এটি যৌক্তিক বলে মনে হয়।


আমি মনে করি না যদি আপনার লাইনের তারিখের (around তারিখ) প্রয়োজন হয়। যদি (তারিখ ($ ফর্ম্যাট, স্ট্রোটোটাইম ($ তারিখ)) == $ তারিখ) - পর্যাপ্ত হতে হবে
iateadonut

7

আপনি চেকডেট পিএইচপি ফাংশন সহ প্রিগ_ম্যাচ ব্যবহার করতে পারেন

$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;

প্রিগ_ম্যাচ ("/ ^ ([0-9] {4})) - ([0-9] {2}) - ([0-9] {2}) $ /", $ তারিখ, $ বিভাজন)) && চেকডেট ($ বিভক্ত [2], $ বিভক্ত [3], $ বিভক্ত [1]);
টিবিরিউ-আয়নু স্টান

5

প্রিগ_ম্যাচটির ডিলিমিটার হিসাবে একটি / বা অন্য চর দরকার।

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)

অগ্রণী শূন্য ছাড়াই দিন ও মাস অনুমোদিত। আপনি যদি এটির অনুমতি দিতে না চান তবে রিজ এক্সপ্যাকটি হ'ল:

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

2

কারও পক্ষে সম্ভবত দরকারী:

$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সত্যিই? অধিকন্তু, কখনও কখনও এক মিনিটে seconds১
টোটো

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 ফর্ম্যাটের জন্য একটি রেজিেক্স রয়েছে (বছরটি 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: $ ফর্ম্যাট 1 = "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

জেনেরিক তারিখের ফর্ম্যাটটি বৈধকরণের কাজ:

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

পিএইচপি তে তারিখগুলি নিয়ে কাজ করার জন্য আপনাকে পিএইচপি স্ট্যান্ডার্ডটি অনুসরণ করা উচিত যাতে প্রদত্ত রেইগেক্স নিশ্চিত করবে যে আপনার কাছে বৈধ তারিখ রয়েছে যা পিএইচপি দিয়ে পরিচালনা করতে পারে।

    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
টোটো

0

এই পদ্ধতিটি পিএইচপি-তে তারিখটি বৈধ করতে কার্যকর হতে পারে। বর্তমান পদ্ধতিটি মিমি / ডিডি / ইয়াহী বিন্যাসের জন্য। আপনার ফর্ম্যাট অনুসারে আপনাকে চেকডেটে প্যারামিটার সিকোয়েন্স আপডেট করতে হবে এবং বিস্ফোরণে ডিলিমিটার করতে হবে ।

    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

[আপনি যদি সিম্ফনি ব্যবহার করেন তবে ৪.১.২ চেষ্টা করে দেখুন] [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);
}

0

আমি "তারিখকে কীভাবে বৈধ করতে হবে" সন্ধান করছিলাম এবং এই সমাধানটি পেয়েছি, এটি পুরানো তবে আমি নীচে নীচে ভাগ করে নেব যা পিএইচপি তে তারিখটি বৈধ করার জন্য ব্যবহার করা যেতে পারে,

checkdate('01', '31', '2019')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.