• ベストアンサー

入力された日付の正規表現の仕方を教えて下さい。

こんばんは、いつもお世話になっております。 過去ログをあさってみたのですが、探し方が悪いのか 見つけられず…。 どうかご指導よろしくお願い申し上げます。 フォームに入力された値のチェックを、CGIに渡す前に ジャバスクリプトでもチェックしたいと思っています。 未入力や半角英数字以外のエラーチェックは出来たのですが yyyy/mm/dd形式で日付の入力をして欲しい時の チェックの書き方がわかりません。 私なりに色々と調べてみて、 if(myForm.day.value.match(/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/)){ alert("日付は半角でyyyy/mm/dd形式でご記入下さい"); return false; } と記述してみたのですが、9999/99/99のような、ありえない 日付でも通ってしまいます。 そればらば、とおもい if(myForm.day.value.match(/^[2-3][0-9][0-9][0-9]\/[0-1][0-9]\/[0-3][0-9]$/)){ alert("日付は半角でyyyy/mm/dd形式でご記入下さい"); return false; } と書いてみたのですが、こちらはエラーが出ました(泣) どうか、ご指導よろしくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.3

以下、サンプルです。 厳密なチェックは不要との事でしたが両方用意してあるので好みで好きな方を残してください。 <html> <head> <title></title> <script type="text/javascript"> function _checkDate(objName) { var Value = document.getElementsByName(objName)[0].value; //形式チェック if(! Value.match(/^(\d{4})\/(\d{2})\/(\d{2})$/)) return false; //年月日を取り出し var sYear = parseInt(RegExp.$1); var sMonth = parseInt(RegExp.$2); var sDay = parseInt(RegExp.$3); //以下7行は年/月/日の個別のチェック if(sYear<2000) return false; if(sYear>2999) return false; if(sMonth<1) return false; if(sMonth>12) return false; if(sDay<1) return false; if(sDay>31) return false; return true; //以下7行は日付の厳密な妥当性チェック if(sYear<2000) return false; if(sYear>2999) return false; var oDate = new Date(Date.parse(Value)); if(oDate.getFullYear() != sYear) return false; if(oDate.getMonth() != (sMonth-1)) return false; if(oDate.getDate() != sDay) return false; return true; } </script> </head> <body> <input type="text" size="15" name="date1"> <input type="button" value="CHECK" onclick="alert(_checkDate('date1'))"> </body> </html> なお、「javascript 日付 チェック」で検索すれば色々なタイプのサンプルコードが見つかります。

sibazuke
質問者

お礼

steel_grayさま。 ご指導ありがとうございました。 ばっちりでした! 「javascript 日付 正規表現」で探しておりました…。 ありがとうございました。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

JavaScriptは得意でないのでちょっとPerlで書いてみました。 JavaScriptでもそのまま使える表現のみ使っているはずなのでプログラム部分を JavaScriptにすればOKだと思います。 とりあえず ・年の部分は2000~2999のみを受け付ける ・月の部分は0~12を受けつけ、1~9月は0が前置されているものとする ・日は月にかかわらず1~31まで受け付ける という方針です。 use strict; use warnings; while (<DATA>) { chomp; if (/^2[0-9][0-9][0-9]\/(0[1-9]|1[12])\/(3[01]|[12][0-9]|0[1-9])$/) { print "vaild: $_\n"; } else { print "invalid: $_\n"; } } __END__ 1999/12/31 2000/01/01 2000/13/01 2999/12/31 2999/12/32 3000/01/01 2345/6/15 2001/06/31 2001/02/29

sibazuke
質問者

お礼

こんばんは。 なんどもご指導ありがとうございました。 while (<DATA>) { の部分に while ($hoge) { と入れて試していたのですが、yyyy/mm/dd形式で 入力しているのに、エラーが出てしまいました…(泣) 今回は、NO3様にご指導頂いた方法で行こうと思います。 ありがとう御座いました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

・年は何年まで許されるのか明確でない ・一月あたりの日数は月によって異なる、特に2月はうるう年による違いがありうる という事情があるので、正規表現だけでやるのはやめておいたほうが 無難だと思います。形式のみのチェックは正規表現でやるにしても その先のチェックは別個にやったほうが楽でしょう。

sibazuke
質問者

お礼

sakusaker7様。 こんばんは。 ご指導ありがとうございます。 厳格な日付の入力チェックはとりあえず置いておこうと 考えております。 年は2000年以降2999年までをOKとし、うるう年の チェックは無しで、とりあえず半角数字の yyyy/mm/dd(2006/07/30)という形式であればOKと したいのです。 どうかご指導よろしくお願い申し上げます。

関連するQ&A

専門家に質問してみよう