09. maj 2006 - 18:22Der er
21 kommentarer og 1 løsning
Validering af dato med RegExp samt JS
Hejsa,
Jeg har en formular med et felt hvor der skal indtastes en fødselsdato i formatet mm-dd-yyyy. Dette vil jeg gerne validere vha af JS og regexp som jeg gør ved mit emailfelt:
if(!indsend.email.value.match(/^.*?@\w[\w.-]*\.[a-z]{2,6}$/i)){ alert('Email-adresse skal udfyldes med en gyldig adresse'); indsend.email.focus(); return false; }
Men kan ikke hitte ud af Regexp hos dato feltet?? Er kommet frem til noget i den her dur: /^(\d{2}\-){2}\d{4}\...
Ikke som regexp. Du kan tjekke tallene den består af bagefter, men så skal du have alle 3 ud.
d="88-02-1112"; if (a=d.match(/^(\d{2})-(\d{2})-(\d{4})$/)) { alert("stort set ok"); if (a[1]>31) { alert("men datoen er helt hen i vejret"); } } else { alert("fejl"); }
-- jeg fandt så lige en gammel _meget_ udbygget udgave i mine gemmer:
function checkDato(dato){ var reg = /[ \.\/]/g,tmp; var val = dato.replace(reg, "-");//erstat alle punktummer og mellemrum med - if(dato.match(/^\d{8}$/))val = dato.substring(0,2)+"-"+dato.substring(2,4)+"-"+dato.substring(5);//8 cifre fortolkes som en dato if(val.indexOf("-")==-1||!val.match(/[\d-]{4,10}/))return dato;//Hvis der ikke er bindestreger eller strengen er kortere end 4 eller længere end 10 tegn, kan vi ikke oversætte val = val.split("-");//Del værdien op i tre dele ved bindestregerne if(val.length!=3)return dato;//Hvids der ikke er 3 værdier kan vi ikke oversætte for(i=0;val.length>i;i++)val[i] = +val[i];//Konverter værdier til tal if(val[2]<31&&val[0]>31){//Hvis første tal er større end 31, må det være åå(åå)-mm-dd, byt dato og år tmp = val[0]; val[0] = val[2]; val[2] = tmp; } if(val[0]<12&&val[1]>12){//Hvis anden værdi er større end 12 og første er mindre, må det være mm-dd-åå(åå) tmp = val[0]; val[0] = val[1]; val[1] = tmp; } val[2] += (val[2]>100)?0:(70>val[2])?2000:1900;//Hvis 3. værdi er tocifret skal den reguleres til rette århundrede (her 1970-2069 !-) var dat = new Date(val[2], val[1]-1, val[0]); if(dat.getYear()!=val[2]&&dat.getFullYear()!=val[2]||dat.getMonth()+1!=val[1]||dat.getDate()!=val[0])return dato;//Hvis ikke resultatet er en reel dato opgiver vi return ((val[0]>9)?"":"0") + val[0] + "-" + ((val[1]>9)?"":"0") + (val[1]) + "-" + dat.getFullYear(); }
-- men en kortere og mere brugbar:
function checkDate(dato){//dato i dd-mm-åååå var dat = dato.split("-"); var chDate = new Date(dat[2],dat[1]-1,dat[0]); if(chDate.getFullYear() != dat[2] || chDate.getMonth()+1 != dat[1] || chDate.getDate() != dat[0]){ alert("Ugyldig dato"); return false; } }
Ved godt at tråden er lukket, men håber alligevel du lige vil svarer på et sidst spg:
hos /^(0[1-9]|1[0-2])\-(0[1-9]|[1-2]\d|3[01])\-(19|20)\d{2}$/ hvorfor bruger du lige pludselig \d|3[01] istedet for bare 3[01] som du har gjort hele vejen forinden????
Super mente bare at \d betød at det skulle være tal, så blev jeg også klogere i dag. Tak for en god besvarelse Erik.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.