Dla tych, którzy na to patrzą i są całkowicie zdezorientowani, oto fragment mojego scenariusza. Niestety, wszystko, co robi, to dopasowywanie prawidłowych liczb w danych wejściowych daty i czasu, a 31 lutego zostanie oznaczony jako prawidłowy, ale jak wielu powiedziało, regex naprawdę nie jest najlepszym narzędziem do wykonania tego testu.
Aby dopasować datę w formacie „rrrr-MM-dd gg: mm” (lub w dowolnej kolejności)
var dateerrors = false;
var yearReg = '(201[4-9]|202[0-9])'; ///< Allows a number between 2014 and 2029
var monthReg = '(0[1-9]|1[0-2])'; ///< Allows a number between 00 and 12
var dayReg = '(0[1-9]|1[0-9]|2[0-9]|3[0-1])'; ///< Allows a number between 00 and 31
var hourReg = '([0-1][0-9]|2[0-3])'; ///< Allows a number between 00 and 24
var minReg = '([0-5][0-9])'; ///< Allows a number between 00 and 59
var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');
$('input').filter(function () {return this.id.match(/myhtml_element_with_id_\d+_datetime/);}).each(function (e) {
if (e > 0) {
// Don't test the first input. This will use the default
var val = $(this).val();
if (val && !val.trim().match(reg)) {
dateerrors = true;
return false;
}
}
});
if (dateerrors) {
alert('You must enter a validate date in the format "yyyy-mm-dd HH:MM", e.g. 2019-12-31 19:30');
return false;
}
Powyższy skrypt zaczyna się od zbudowania obiektu regex. Następnie znajduje wszystkie wejścia, których identyfikator pasuje do określonego wzorca, a następnie przechodzi przez nie. Nie testuję pierwszego znalezionego wejścia ( if (e > 0)
).
Trochę wyjaśnienia:
var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');
^
oznacza początek meczu, natomiast $
oznacza koniec meczu.
return this.id.match(/myhtml_element_with_id_\d+_datetime/);
\d+
oznacza dopasowanie pojedynczej lub ciągłej sekwencji liczb całkowitych, więc myhtml_element_with_id_56_datetime
i myhtml_element_with_id_2_datetime
będzie pasować, ale myhtml_element_with_id_5a_datetime
nie będzie