2015-01-24 3 views
2

Мне нужно сделать проверку даты, чтобы принять ее в формате dd/mm/yyyy. Однако все условия работает нормально, за исключением того, если я введу год 6 цифр он также принимая его, как -Дата подтверждения валидации

12/12/200000

согласно мой код является действительным. Ниже приведен мой код:

function validate(value) { 
      if(!value.match(/\d\d\/\d\d\/\d\d\d\d/)) 
       return false; 
      return checkdate(value); 
} 

function checkdate(val) 
{ 
    var dates = val.split(/\D/); 
    if(dates[0] <= 0 || dates[0] > 31) 
     return false; 
    if(dates[1] <= 0 || dates[1] > 12) 
     return false; 
    var now = new Date(dates[2],dates[1]-1,dates[0]); 
    if (isNaN(now)) 
     return false; 
    now.setHours(0,0,0,0); 
    if (now.getFullYear() == dates[2] && now.getMonth() + 1 == dates[1] && now.getDate() == dates[0]) 
     return true; 
    return false; 
} 

Я не уверен, почему он разрешает год как 6 цифр действительного ввода?

+0

Ваш раскол, вероятно, не правильно. Ничто не будет соответствовать вашему расколу – Dummy

+0

Но reg exp не должен допускать код до этой точки – Prakash

+0

Создайте регулярное выражение, подобное этому 'var regExp =/\ d {2} \/\ d {2} \/\ d {4} /' затем проверьте его с помощью функции match(), тогда вам не нужно создавать какую-либо дополнительную функцию для проверки действительности каждой поданной – Dummy

ответ

1

Вы не ограничивая регулярное выражение с начала и остановки разделителей, так 12/12/200000 совпадение, как это соответствует регулярное выражение, а затем некоторые

if (!value.match(/^\d\d\/\d\d\/\d\d\d\d$/)) 

Как Замечание, вам не придется вводить \d четыре раза, вы можете сделать \d{4} в соответствии с четырьмя экземплярами \d

+0

. Спасибо, изменив reg exp в соответствии с вашим предложением, решила мою проблему. – Prakash

2

Проблема в validate Функция, регулярное выражение, которое оно соответствует, позволяет вводить значения, которые вы не хотите передавать как действительные. Помимо очевидного формата dd/mm/yyyy, он позволяет найти текст в любом месте строки. В принципе, вы сказали, что для проверки «если есть выражение внутри строки», когда это должно было быть «если вся строка соответствует этому выражению».

Чтобы исправить проблему, добавьте ^ в начале и $ в конце. ^ обозначает начало строки и $ для струнного конца:

/^\d\d\/\d\d\/\d\d\d\d$/

Я думаю, что вы выиграли бы от чтения documentation на синтаксисе регулярных выражений, используемых JavaScript.

В то время как у людей возникают проблемы с чтением длинных повторяющихся последовательностей похожих символов, например, в вашем регулярном выражении. Это выражение проще для понимания и делает то же самое:

/^\d{2}\/\d{2}\/\d{4}$/

0

Если вы хотите проверить строку даты создания объекта Date, вам не нужно, чтобы проверить всю картину, просто создать и Введите дату и проверьте результат. Вам действительно нужны две цифры для номера дня и месяца?

Если вы хотите 4-значный год, это необходимо проверить отдельно, поскольку конструктор с радостью преобразует двухзначные годы в 20-й век. Если вы действительно нужно две цифры дня и месяца, которые могут быть проверены в то же время, как год:

function validateDMY(s) { 
    var b = s.split(/\D/); 
    var d = new Date(b[2], --b[1], b[0]); 
    return d && /^\d{4}$/.test(b[2]) && b[1] == d.getMonth(); 
} 

console.log(validateDMY('30/02/2015')); // false 
console.log(validateDMY('30/22/2015')); // false 
console.log(validateDMY('02/02/15')); // false 
console.log(validateDMY('30/01/2015')); // true 
+0

Спасибо за детали. – Prakash

Смежные вопросы