PHPを扱う人なら誰もが扱ったでことがあるであると思うformタグのnameの値を$_POST型で受け取り値を反映するサイト。そのようなサイト制作に取り組んでいて、受け取る値(変数・配列)がdate型に当てはまるか判定したいときに使える関数を製作いたしました。
まだ不完全な部分もありますがデータベースと連携することでこの関数はdate型のフォーマットに当てはまるか判定できます。
配列をそれぞれdate型か判定する関数
$date_array=["2020-02-14","2019/01/15","1990516",//正しい日付として出力
"2010/8/17","2022020180","2005/09-32","xxxx-yy-zz",//エラー
"0000-00-00","9999-99-99" //極端な数字でも出力→しかもdateの限界か出力される値がおかしい。
];
check_array($date_array);
function check_array($date_array) {
$pattern="#^\d{4}([/-]?)\d{2}\\1\d{2}$#";
foreach ($date_array as $judged_date){
if(preg_match($pattern,$judged_date,$match)){
print date("Y-m-d",strtotime($judged_date));
print 'は正しい日付である<br>';
}else{
print $judged_date."は日付ではありません<br>";
}
}
結果
2020-02-14は正しい日付である
2019-01-15は正しい日付である
1990516は日付ではありません
2010/8/17は日付ではありません <!-- エラー -->
2022020180は日付ではありません
2005/09-32は日付ではありません
xxxx-yy-zzは日付ではありません
-0001-11-30は正しい日付である <!-- 極端な数字でも出力 -->
1970-01-01は正しい日付である
解説
流れとしては対象の配列を変数$judged_date
として出力し、その変数をpreg_match
で$pattern
に当てはまるものならdate
とstrottime
で日付のフォーマットとして返すという処理を行っています。
変数をdate型か判定する関数
$date = "2022-06-24";
check_param($date);
function check_param($date) {
$pattern="#^\d{4}([/-]?)\d{2}\\1\d{2}$#";
if(preg_match($pattern,$date,$match)){
print date("Y-m-d",strtotime($date));
print 'は正しい日付である';
}else{
print "は日付ではありません";
}
}
結果
2022-06-24は正しい日付である
解説
配列を判定した関数の引数を変数に変換しただけのものでございます。そのため、上記の配列判定の関数が理解できれば理解できると思います!
まとめ
配列判定の関数で示したようにまだ不完全なものではあります。
データベースと連携することでこの関数はdate型か判定できます。
しかし、このように述べたように対象の文字列をdate型のフォーマットに当てはまるかどうか判定する時には利用しがいがあるのではないかなと思います。
(どちらにしろDBがdate型じゃないとDBに保存できず、invalid datetime format
のエラーを返すからあまり意味がないのでは??という意見は心にしまっておいてくださいmm)
この記事がみなさんの参考になれば幸いです。改善案等もあればよろしくお願いいたします🙇♂️