誕生日の入力をチェックする式を、このdd/mm/yyyyのような形式に一致させるにはどうすればよいですか?これまでに出てきたものは以下のとおりですが、99/99/9999を入れるとこれもかかります!
if (!preg_match("/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/", $cnt_birthday))
{
$error = true;
echo '<error elementid="cnt_birthday" message="BIRTHDAY - Only this birthday format - dd/mm/yyyy - is accepted."/>';
}
Ddの場合は01から31、mmの場合は01から12のみであることを確認するにはどうすればよいですか?しかし、私はyyyyを制限する方法を確信しています...理論上の9999は許容できるはずだと思います...もっと良いアイデアがあれば教えてください!
ありがとう、ラウ
代わりに checkdate() を使用することをお勧めします:
if (preg_match("/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/", $cnt_birthday, $matches)) {
if (!checkdate($matches[2], $matches[1], $matches[3])) {
$error = true;
echo '<error elementid="cnt_birthday" message="BIRTHDAY - Please enter a valid date in the format - dd/mm/yyyy"/>';
}
} else {
$error = true;
echo '<error elementid="cnt_birthday" message="BIRTHDAY - Only this birthday format - dd/mm/yyyy - is accepted."/>';
}
したがって、正規表現は形式を検証し、checkdateは実際の日付を検証します。
strtotime()
の使用を検討し、date()
で再フォーマットします。日付を入力する際の柔軟性が向上し、さまざまな場所で必要な形式を使用できるようになります。
個人的には、正確な日付計算に関してはかなり怠惰で、strtotime("-10 day",$timestamp)
のように悪用しています。これには、うるう年を正しく考慮せずに、幼い娘の年齢を18歳をわずかに超えると計算し、大人をテーマにしたサイトに連れて行くため、イライラした親に訴えられる可能性が低くなるという利点がありますが、ばかげているように聞こえるかもしれません。
if(preg_match("/(\d{2})\/(\d{2})\/(\d{4})$/", $date,$matches)){
return (checkdate((int) $matches[2],(int)$matches[1],(int) $matches[3]) );
}else{
return false ;
}
$ok = DateTime::createFromFormat('d/m/Y',$datestring)->format('d/m/Y') == $datestring;
PHP> = 5.3
本当に肛門性格を保つには、現在の正規表現を使用し、数値を解析して、 checkdate() の範囲内にあることを確認する方が簡単な場合がありますが、キックの場合は、これがdates = 01-31(および1-9)、およびmonth = 01-12(および1-9)。
preg_match("/([012]?[1-9]|[12]0|3[01])\/(0?[1-9]|1[012])\/([0-9]{4})/", $date_string)
いくつかの注意事項
|
)内ですが、特定のことを実行したい場合は、これらの値を抽出するのにも役立ちます多分このようなものが役立つでしょう
list($month,$day,$year)=explode("/",$date);
if(checkdate($month,$day,$year))
{
echo "good";
}
else{echo "bad";}
この正規表現を試してください:([0-9]{2}\/[0-9]{2}\/[0-9]{4})
厳密にフォーマットされた文字列のみを受け入れることは、おそらく悪い習慣です。 Webページから入力を取得していると仮定すると、月、日、年に別々のフィールドを設定することをお勧めします。それらは単なるテキストボックスである可能性がありますが、制限の問題を解決するドロップダウンメニューを使用することをお勧めします(つまり、月の選択肢は1,2、...、12のみです)。ユーザーが2001年1月1日を入力し、2001年1月1日を受け入れないようにすることは、怠惰なプログラミングです。そして、区切り文字として「/」だけを受け入れるのは厄介です。
ただし、フォーマットされた文字列を使用することにした場合でも、元の質問に触れるには、生年月日フィールドであるため、yyyyを次のように制限する必要があります。
if($yyyy > date('Y')) {
echo '<error elementid="cnt_birthday" message="BIRTHDAY - Year must be less than or equal to the current year."/>';
}
そうでなければ、人々は負の年齢を持つ可能性があります:)
私はこれを見るのが遅いです、しかしこれは私の問題を解決しました
if (1 !== preg_match('/(0[1-9]|1[0-9]|2[0-9]|3(0|1))\/(0[1-9]|1[0-2])\/\d{4}/',$value)) {
$this->form_validation->set_message('validate_emaildate','Date needs to have a valid date format - dd/mm/yyyy');
return FALSE;
}
次の投稿の礼儀:
正規表現形式 ここ .. Abinに感謝します。
フォーマットをチェックする関数[ここ]( Codeigniterの正規表現の一致 ).. Hashemに感謝
+乾杯
おそらく最善の解決策ではありませんが、これが私の試みです。
それを時間に変換してから、m/d/Yに再フォーマットします。文字列が変更されていない場合は、最初から正しい形式でした。
$transformedDate = date("m/d/Y", strtotime($myDate));
if($transformedDate == $myDate){
return true;
} else{
return false;
}