Как упростить проверку и отчетность по действительной дате в JavaScript? - PullRequest
0 голосов
/ 25 апреля 2011

Из любопытства, есть ли кто-нибудь, кто знает способ упростить этот процесс. Я пишу регулярное выражение для валидатора даты, который принимает только форматы mm.dd.yyyy mm / dd / yyyy или mm-dd-yyyy. Я думаю, что этот способ работает, но, похоже, он действительно затянут.

function c(x, y)
 {
 //check that there is a date and in right order
 if ((x==1) || (x==3))
 {
  if( y == "")
   {alert("You have not entered a date");
    return false;
   }
  var string = document.getElementById('date');
  var w = string.value.search(/^(\d{2})([ ./-]{1})(\d{2})\2(\d{4})$/);
  if (w != 0)
        {
     alert("Bad Date pattern match please redo");
     return false;
    }   
  var patt=/\d{2}/
  var result=patt.exec(string.value);
  if(result > 12)
   {
    alert("Please redo Date(Month)");
        return false;
   }
  patt2=/([ ./-])\d{2}\1/
  result=patt2.exec(string.value);
  result=patt.exec(result);
  if(result > 31)
   {
    alert("Please redo Date(Days)");
    return false;
   }
  patt=/([ ./-])\d{4}/
  result=patt.exec(string.value);
  patt2=/\d{4}/
  result=patt2.exec(result);
  if(result > 2011)
   {
        alert("Please redo Date(Years)");
        return false;
   }    
 }

Ответы [ 5 ]

0 голосов
/ 09 ноября 2012

Это

function c(a, b) {
if (a == 1 || a == 3) {
    if (b == "") return alert("You have not entered a date"), !1;
    var c = document.getElementById("date"),
        d = c.value.search(/^(\d{2})([ ./-]{1})(\d{2})\2(\d{4})$/);
    if (d != 0) return alert("Bad Date pattern match please redo"), !1;
    var e = /\d{2}/,
        f = e.exec(c.value);
    if (f > 12) return alert("Please redo Date(Month)"), !1;
    if (patt2 = /([ ./-])\d{2}\1/, f = patt2.exec(c.value), f = e.exec(f), f > 31) return alert("Please redo Date(Days)"), !1;
    if (e = /([ ./-])\d{4}/, f = e.exec(c.value), patt2 = /\d{4}/, f = patt2.exec(f), f > 2011) return alert("Please redo Date(Years)"), !1
}
}
0 голосов
/ 25 апреля 2011

Регулярное выражение должно быть монстром, чтобы поймать любой неправильный ввод, как 29 февраля 2011 года.

Проще попытаться сделать дату ввода, а затем проверить, чтобы 2/29 не оценивалось как 3 / 1.

function isvalid_mdy(s){
    var day, A= s.split(/\D+/);
    A[0]= parseInt(A[0], 10)-1;
    A[1]= parseInt(A[1], 10);
    A[2]= parseInt(A[2], 10);
    try{
        day= new Date(A[2], A[0], A[1]);
        if(day.getMonth()== A[0] && day.getDate()== A[1]) return day;
        throw new Error('Bad Date '+s);
    }
    catch(er){
        alert(er.message)
        return NaN;
    }
}
var s1= '04/31/2011';
isvalid_mdy(s1)
0 голосов
/ 25 апреля 2011

Тот код, который вы разместили, причиняет мне боль. Пожалуйста, прекратите.

x = 'mm-dd-yyyy'

xArray = x.split('-')

for(var i = 0; i < 3; i++)
  (isNumeric(xArray[0])) ? null : return false

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

Регулярные выражения: ПЛОХО и МЕДЛЕННО избегайте их в максимально возможной степени.

0 голосов
/ 25 апреля 2011
//The OP asked for a simpler way, and here it is:
function validateDate(dateValue)
{
  //improving the regular expression to do even more wonders 
  //is left as an exercise :-)
  var pattern = /^(0[1-9]|1[012])[/.-](0[1-9]|[12][0-9]|3[01])[/.-](19|20)\d\d$/
  if(pattern.test(dateValue) == true)
    alert('valid date');
  else
    alert('invalid date');
}
//OK, I don't have lots of the fine-grained error messages in, 
//but all 3 formats should pass this
0 голосов
/ 25 апреля 2011

Вы смотрели на Регулярное выражение, совпадающее с действительной датой ?

Вот пример регулярного выражения для разбора mm/dd/yyyy.

^(0[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01])/(19|20)\d\d$

Вы можете изменить разделители для разбора mm.dd.yyyy и mm-dd-yyyy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...