web-dev-qa-db-ja.com

preg_match:誕生日の形式を確認してください(dd / mm / yyyy)

誕生日の入力をチェックする式を、この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は許容できるはずだと思います...もっと良いアイデアがあれば教えてください!

ありがとう、ラウ

10
laukok

Tim 's checkdate ベースのソリューションに基づく:

日、月、年の抽出は、次のようにexplodeを使用して簡単に実行できます。

list($dd,$mm,$yyyy) = explode('/',$cnt_birthday);
if (!checkdate($mm,$dd,$yyyy)) {
        $error = true;
}
24
codaddict

代わりに 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は実際の日付を検証します。

25
Tim Fountain

strtotime()の使用を検討し、date()で再フォーマットします。日付を入力する際の柔軟性が向上し、さまざまな場所で必要な形式を使用できるようになります。

個人的には、正確な日付計算に関してはかなり怠惰で、strtotime("-10 day",$timestamp)のように悪用しています。これには、うるう年を正しく考慮せずに、幼い娘の年齢を18歳をわずかに超えると計算し、大人をテーマにしたサイトに連れて行くため、イライラした親に訴えられる可能性が低くなるという利点がありますが、ばかげているように聞こえるかもしれません。

3
artificialidiot
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 ;
}
  • パターンdd/mm/yyyyを検証するためのpreg_match
  • 日付値を検証するためのcheckdate
3
Yehia
$ok  = DateTime::createFromFormat('d/m/Y',$datestring)->format('d/m/Y') == $datestring;

PHP> = 5.3

2
Wrikken

本当に肛門性格を保つには、現在の正規表現を使用し、数値を解析して、 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)

いくつかの注意事項

  • ORに必要なすべてのグループ化を使用しました(|)内ですが、特定のことを実行したい場合は、これらの値を抽出するのにも役立ちます
  • 0000は日付としてはあまり意味がありませんが、読者への演習として、その正規表現の爆発を残しました。本当にこれで生年月日を確認したい場合(そして現在または比較的最近亡くなった人を期待している場合)は、1900 +または1800+、あるいはあなたにとって許容できる範囲に制限してください。あなたが歴史上の人物の誕生日を解析しているかもしれないなら...あなたの電話。
  • これでも、問題の月の日付範囲が正しいかどうかはチェックされません!したがって、その場合は checkdate()
1
Chadwick

多分このようなものが役立つでしょう

 list($month,$day,$year)=explode("/",$date);
if(checkdate($month,$day,$year))
{
echo "good";
}
else{echo "bad";}
1
Sujay sreedhar

この正規表現を試してください:([0-9]{2}\/[0-9]{2}\/[0-9]{4})

0
dialyy

厳密にフォーマットされた文字列のみを受け入れることは、おそらく悪い習慣です。 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."/>';
}

そうでなければ、人々は負の年齢を持つ可能性があります:)

0
catgofire

私はこれを見るのが遅いです、しかしこれは私の問題を解決しました

    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に感謝

+乾杯

0
devak23

おそらく最善の解決策ではありませんが、これが私の試みです。

それを時間に変換してから、m/d/Yに再フォーマットします。文字列が変更されていない場合は、最初から正しい形式でした。

$transformedDate = date("m/d/Y", strtotime($myDate));

if($transformedDate == $myDate){        
    return true;    
} else{         
    return false;           
}
0
NL3294