プロが教えるわが家の防犯対策術!

こんばんは、いつもお世話になっております。
過去ログをあさってみたのですが、探し方が悪いのか
見つけられず…。
どうかご指導よろしくお願い申し上げます。

フォームに入力された値のチェックを、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;
}
と書いてみたのですが、こちらはエラーが出ました(泣)
どうか、ご指導よろしくお願い申し上げます。

A 回答 (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 日付 チェック」で検索すれば色々なタイプのサンプルコードが見つかります。
    • good
    • 0
この回答へのお礼

steel_grayさま。
ご指導ありがとうございました。

ばっちりでした!

「javascript 日付 正規表現」で探しておりました…。

ありがとうございました。

お礼日時:2006/07/23 11:13

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
    • good
    • 0
この回答へのお礼

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

今回は、NO3様にご指導頂いた方法で行こうと思います。
ありがとう御座いました。

お礼日時:2006/07/23 11:15

・年は何年まで許されるのか明確でない


・一月あたりの日数は月によって異なる、特に2月はうるう年による違いがありうる

という事情があるので、正規表現だけでやるのはやめておいたほうが
無難だと思います。形式のみのチェックは正規表現でやるにしても
その先のチェックは別個にやったほうが楽でしょう。
    • good
    • 0
この回答へのお礼

sakusaker7様。
こんばんは。

ご指導ありがとうございます。
厳格な日付の入力チェックはとりあえず置いておこうと
考えております。

年は2000年以降2999年までをOKとし、うるう年の
チェックは無しで、とりあえず半角数字の
yyyy/mm/dd(2006/07/30)という形式であればOKと
したいのです。

どうかご指導よろしくお願い申し上げます。

お礼日時:2006/07/23 01:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!