javascript regexp、日付問題の検証


Answers

私はDavidにこれに同意します...正規表現マッチは、渡された日付が実際に有効かどうかを判断する排他的な基準として使用すべきではありません。 Javascript検証の通常の手順には、いくつかの手順があります。

a。 最初のステップは、渡された文字列がRegexと照合することによって期待される日付のフォーマットに一致することを保証することです。 以下はより厳密な正規表現パターンです。

// Assuming that the only allowed separator is a forward slash.
// Expected format: yyyy-mm-dd
/^[12][90][\d][\d]-[0-3]?[\d]-[01]?[\d]$/

b。 2番目の手順では、文字列を解析してDateオブジェクトにし、Noを返します。 1970年以降のミリ秒数です。この数値は、Dateコンストラクタのパラメータとして使用します。

c。 JSは自動的に渡された日付を最も近い有効な値にロールオーバーするため、作成されたDateオブジェクトが渡されたものと一致するかどうかは分かりません。 これが起こったかどうかを判断するには、渡された文字列を区切り文字で分割し、個々の日付コンポーネントを比較するのが最善の方法です。

// d is the created Date object as explained above.
var arrDateParts = inputDate.split("-");
if ((d.getFullYear() == arrDateParts[0]) && (d.getMonth() == arrDateParts[1]) && (d.getDate() == arrDateParts[2]))
  return true;
else
  return false;
Question

私は以下の日付を検証するためのいくつかのコードを持っています:


function validateForm() {
var errFound = 0;       
//var patt_date = new RegExp("^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))$");
var patt_date = new RegExp("^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$");
if (patt_date.test(document.getElementById("datefrom").value) == false){errFound = errFound + 1;document.getElementById("datefrom").className = "error";}

if (errFound > 0)
    alert('Please correct red colored field!');
else
    return true;
return false;   
}


上記のコードはYYYY-MM-DD形式では動作しますが、 「2009-02-29」などの日付の検証に失敗します

コメントのあるコードは動作するはずです(// var patt_date = new RegExp ...)"2009-02-29"をキャッチできます。
しかし、私は無効なデータを入れてそれを修正しようとすると、検証を台無しにして、それは(私はそれらを修正した後、

たぶん、誰かが現在の正規表現を修正することができますか?

編集 、私は上記のregexpの単純な置き換えをしたい、新しい正規表現のパターンを意味する新しいメソッドの日付を検証する
参考までに、私は単純にregexpパターンを取得します:
http://www.regexlib.com/REDetails.aspx?regexp_id=694
http://www.regexlib.com/REDetails.aspx?regexp_id=933

2009年2月29日にテストされました。 再度問題は2番目のregexpが値2009-02-29を無効として検出できなかったのですが、1番目は可能です(ただし、コードが壊れていますか?それで何か間違っているはずです)。

ありがとう、
Dels