Avatar billede b_ Nybegynder
09. maj 2006 - 18:22 Der 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}\...

HJÆLP....
Avatar billede erikjacobsen Ekspert
09. maj 2006 - 18:31 #1
Er det ikke bare som du allerede har: /^(\d{2}\-){2}\d{4}$/
Avatar billede b_ Nybegynder
09. maj 2006 - 19:05 #2
har prøvet a la dette i diverse udstrakninger:

if(!indsend.foedt.value.match(/^(\d{2}\-){2}\d{4}$/){
    alert('fejl');
    indsend.foedt.focus();
    return false;
  }

men kan ikke få det til at virke!!!
Avatar billede erikjacobsen Ekspert
09. maj 2006 - 19:26 #3
Hvad med
if(!indsend.foedt.value.match(/^(\d{2}\-){2}\d{4}$/)){
Avatar billede b_ Nybegynder
09. maj 2006 - 19:43 #4
Det er fa#@%& løgn, var det bare en parentes jeg havde misset ;)

Men min regexp godtager 30-12-1982 og det skal den jo ikke. Har du også en løsning på det?
Avatar billede erikjacobsen Ekspert
09. maj 2006 - 20:33 #5
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");
}
Avatar billede erikjacobsen Ekspert
09. maj 2006 - 20:34 #6
Du får a[1], a[2] og a[3] du efterfølgende kan lege med.
Avatar billede b_ Nybegynder
10. maj 2006 - 10:41 #7
Hmm mit JS er lidt rusten...

Den her virker ikke:
if (a=indsend.foedt.match(/^(\d{2})-(\d{2})-(\d{4})$/)) {

  if (a[1]>12) {
    alert("Fejl i måned");
    indsend.foedt.focus();
    return false;
  }
else
    (a[2]>31){
  alert("Fejl i dag");
  indsend.foedt.focus();
  return false;
}
else if
    (a[3]<1975 || a[3] >1990 ){
  alert("Fejl i år");
  indsend.foedt.focus();
  return false;
}
}
Avatar billede erikjacobsen Ekspert
10. maj 2006 - 10:43 #8
if (a=indsend.foedt.value.match(/^(\d{2})-(\d{2})-(\d{4})$/)) {
Avatar billede erikjacobsen Ekspert
10. maj 2006 - 10:45 #9
og husk "if" hvis du vil sige "else if" - ellers link til siden, eller fejlmeddelelsen fra javascript.
Avatar billede b_ Nybegynder
10. maj 2006 - 10:59 #10
Når jeg kører det sammen med resten af valideringen, validere den overhovedet ikke nogen af felterne, så der må være en fejl ;)

Her er min nuværende validering for dato:

if(!indsend.foedt.value.match(/^(\d{2})-(\d{2})-(\d{4})$/)) {
    alert("Fejl i fødselsdato - eks. 12-24-1982");
    indsend.foedt.focus();
    return false;
  }

Og så vil jeg yderlig tjekke at det første tal ikke er over 12 og det andet over 31... Kan det lade sig gøre. Hele indtastningen foregå i et felt.
Avatar billede roenving Novice
10. maj 2006 - 14:26 #11
/^(0[1-9]|1[0-2])\-(0[1-9]|[1-2]\d|3[01])\-(19|20)\d{2}$/
Avatar billede erikjacobsen Ekspert
10. maj 2006 - 15:05 #12
Jeg troede du ville checke datoen - altså at man ikke fik en 30. februar etc, - men er det kun test for 12 og 31 så gør endelig som roenving foreslår.
Avatar billede b_ Nybegynder
14. maj 2006 - 14:27 #13
Det ville også være det bedste, men roenvings måde er fin eller super ;) Smid et svar begge to, og mange tak for hjælpen
Avatar billede erikjacobsen Ekspert
14. maj 2006 - 14:37 #14
Jeg samler slet ikke på point, tak.
Avatar billede roenving Novice
14. maj 2006 - 23:06 #15
Oki '-)

-- og det skal da tilføjes, at en validering af en datos validitet nemmest laves i javascript via et Date-objekt !-)
Avatar billede b_ Nybegynder
14. maj 2006 - 23:24 #16
Vil du komme med et eksempel roenving... Bruge date i selve database valideringen, men kender den ikke i JS
Avatar billede roenving Novice
14. maj 2006 - 23:32 #17
*lol*

-- 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;
  }
}
Avatar billede roenving Novice
14. maj 2006 - 23:34 #18
-- og tak for point ;~}
Avatar billede b_ Nybegynder
16. maj 2006 - 11:39 #19
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????
Avatar billede b_ Nybegynder
16. maj 2006 - 11:54 #20
eller kan du forklare andet led....

Det logiske ville jo være at opbygge den sådan her (0[1-9]|1[0-9]|2[0-9]|3[0-1])???
Avatar billede erikjacobsen Ekspert
16. maj 2006 - 12:42 #21
\d er det samme om [0-9]  Alle følgende er ækvivalent, og er nok bare et spørgsmål om det skal være nemt for mennesker eller maskiner

0[1-9]|1[0-9]|2[0-9]|3[0-1]
0[1-9]|[1-2][0-9]|3[0-1]
0[1-9]|[1-2]\d|3[0-1]
0[1-9]|[12]\d|3[0-1]
0[1-9]|[12]\d|3[01]

Er man reg.exp.nørd er der en sport i at gøre et udtryk så kort som muligt. Hmm - ku' det være en olympisk disciplin ?
Avatar billede b_ Nybegynder
16. maj 2006 - 13:02 #22
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester