日付をチェックするPHP正規表現はYYYY-MM-DD形式です


97

エンドユーザーが入力した日付がYYYY-MM-DDであることを確認しようとしています。Regexが私の強みではなかったので、設定したpreg_match()に対して誤った戻り値が返されます。

したがって、私は正規表現を混乱させたと仮定しています。

$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
正規表現では日付を検証するには不十分です。正規表現の後、次の2つのいずれかを使用する必要があります:date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";またはPHP checkdate ( int $month , int $day , int $year )
Tiberiu-Ionuț Stan

この時点では検証を試みていません。YYYY-MM-DD形式であることを確認したいだけです。
cosmicsafari

2
ユーザーが入力した値の場合、フォームの送信時に、正規表現の直後以外に検証するための適切な「時点」はどれですか(そのため、エラーを表示できます)?
Tiberiu-Ionuț Stan

フェアポイント、後でヒックアップを保存することができます。
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);
Tiberiu-Ionuț Stan

5
なぜこれが正解とマークされているのですか?これは、2016-02-30や2016-09-31のようないくつかの無効な日付に対してtrueを返します
Graham

7
この質問は日付形式(YYYY-MM-DD)を確認する方法に関するものであり、承認済みとしてマークされた回答が常に最良の回答であるとは限りません。それは、この美しいツアーを読んだ人のために機能したことを意味します:スタックオーバーフロー。 com / tour
ストラミン2017

@Graham古い投稿私は知っていますがStraminに同意します-この質問は形式の検証について尋ねます-実際の日付の検証ではありません
treyBake

98

これには別のメカニズムを使用する方が良いでしょう。

を備えた最新のソリューションDateTime

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

これも入力を検証します。$dt !== false日付を指定した形式で解析できることを確認します。array_sumトリックは、PHPが「月のシフト」を行わないようにするための簡潔な方法です(たとえば、1月32日が2月1日であると見なします)。詳細についてはDateTime::getLastErrors()、を参照してください。

explodeandを使用した旧式のソリューションcheckdate

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

これにより、入力が有効な日付であることも検証されます。もちろん、正規表現でそれを行うことができますが、それはもっと面倒になるでしょう-そして、2月29日は正規表現ではまったく検証できません。

このアプローチの欠点は、どのような状況でも通知を出さずに、起こり得るすべての「不良」入力を拒否するように非常に注意する必要があることです。方法は次のとおりです。

  • explode3つのトークンを返すように制限されています(入力が「1-2-3-4」の場合、$d「3-4」になります)
  • ctype_digit 入力に数字以外の文字が含まれていないことを確認するために使用されます(ダッシュを除く)
  • array_padcheckdate入力が「1-2」の場合にlist()通知を送信しないように十分な要素が返されることを確認するために(失敗するデフォルト値で)使用されます

+1、常に使用されてDateTimeおり、聞いたことがないcheckdate...恥ずかしい。
k102

@ k102:DateTimeこれも実行できます。答えの具体化を終えたところです。よろしければ、もう一度見てください。
2012年

PHPマニュアルを見ると、最初のソリューションは不完全な日付を検証するようです(現在の日付から欠落している値を入力します)。
user2428118 2014年

ソリューション#1のもう1つの問題:「存在しない値がロールオーバーする」。たとえば、2001-02-31は2001-03-03になります。(OPはこれが不可能であることを明示的に尋ねていませんが)
user2428118 '26

1
@ user2428118:ソリューション#1を指定どおりに試しましたか、それとも最初の行だけを試しましたか?ドキュメントへのリンクをクリックしましたgetLastErrorsか?
2014年

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

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

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までの日付で機能します。これは、ほとんどの場合必要であり、私の試みよりも74文字短い(yyyy-mm-dd形式)。1900年より前の日付が必要な場合、Shyjuの回答を少し調整すると、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))$
Graham

36

基準:

400で割り切れない場合を除いて、100で割り切れない場合を除いて、毎年4で割り切れる年はうるう年です。

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

2月のうるう年は29日、うるう年でない場合は28日

4月、6月、9月、11月の30日

1月、3月、5月、7月、8月、10月、12月の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年1月1日から2999年12月31日までの日付をテストします。 技術的には、現在使用されているグレゴリオ暦は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)

2月を除く有効な月日(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))

2月、28日あり:

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

2月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]))))

したがって、YYYY-MM-DD形式の1000年1月1日から2999年12月31日までの日付の正規表現があります。

かなり短縮できると思いますが、他の人にお任せします。

それはすべての有効な日付と一致します。日付が1つだけで、それ以外は何も含まない場合にのみ有効にする場合は、次の^( )$ようにラップします。

^(((((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
それは英雄的な表現であり、非常によく説明されています。
2016年

すべての有効なケースに合格し、すべての無効なケースで失敗するという強力な証拠はありますか?
Md Ashraful Islam

@Md Ashraful Islam No
Graham

@Graham申し訳ありませんが、弊社のWebサイトで使用しています。問題が発生しないことを願っています。
MDアシュラフルイスラム

@Md Ashraful Islam-私たちはこれも使用しており、これまで問題はありませんでした
Graham

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
ここで使用されるdateTime手法は、実際の日付ではない2016-05-44のような日付に対してtrueを返します
nonybrighto

これは、日付(Ymd)を取得する場合は特に良い例ではありません。例:0175-44-19927合格します。
Attila Naghi

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になります。その後、フォーマットをdmYに変更すると、エコーはtrueになります。

この簡単なコードを使用すると、正規表現で確認することなく、どの日付形式が使用されているかを確認できます。

多分すべてのケースでそれをテストする人がいます。しかし、私は私の考えは一般的に有効だと思います。私にはそれは論理的に思えます。


if行の$ dateの周りにdate()は必要ないと思います。if(date($ format、strtotime($ date))== $ date)-十分なはずです
iateadonut

7

preg_matchをcheckdate php関数で使用できます

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

return preg_match( "/ ^([0-9] {4})-([0-9] {2})-([0-9] {2})$ /"、$ date、$ split))&& checkdate($ split [2]、$ split [3]、$ split [1]);
Tiberiu-Ionuț Stan

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-DD1行のステートメントで日付を確認および検証する

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})$/"

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:$ format1 = "2012-12-31";

フォーマット2:$ format2 = "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、 本当に?さらに、1分間に61秒ある場合もあります。en.wikipedia.org
Toto

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と一致します。
estrar 2014年

私が嘔吐している間すみません
AlxVallejo

0

PHPで日付を処理するには、PHPの標準に従う必要があります。これにより、指定された正規表現は、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形式です。あなたは、パラメータの順序で更新する必要がありcheckdateの中にあなたの形式と区切りごとに爆発します

    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

[Symfony 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

Laravel 5.7および日付形式から:2019年12月31日

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

私は「日付を検証する方法」を検索してこのソリューションを見つけました、その古いですが、phpで日付を検証するために使用できるメソッドを以下に共有します、

checkdate('01', '31', '2019')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.