webForumDet fria alternativet

Validera datum med regexp

13 svar · 1 004 visningar · startad av monAmour

monAmourMedlem sedan dec. 2002270 inlägg
#1

Försöker validera ett datum med ett regexp som jag tycker borde fungera men den returnerar FALSE ändå?

Vill att man enbart ska kunna ange datum som YYYY-MM-DD, alltså med bindelsträck emellan, år-månad-dag.

Har testat med det här:

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

men det verkar inte funka? hur ska det se ut?

Peter SMedlem sedan dec. 20025 484 inlägg
#2
/^\d{4}-\d{2}-\d{2}$/

Uttrycket är dock inte optimalt.

:)

monAmourMedlem sedan dec. 2002270 inlägg
#3

Tack! varför behöver man lägga till backslashes? vad betyder det i regexp språk?

JojoxxMedlem sedan juni 20004 306 inlägg
#4

För att uttrycket skall tolkas som digit (siffra) inte inte just "d". :)

monAmourMedlem sedan dec. 2002270 inlägg
#5

ah just ja

MickeA.comMedlem sedan feb. 20034 528 inlägg
#6

Morrn',
Försöker få till tidigare nämnda datumvalidering tillsammans med Jojoxx's "Spärra tecken", men får inte till det alls:

<input type="text" onkeyup="if(!this.value.match([b]/^\d+$/[/b])){ this.value=(this.value.match([b]/\d+/[/b]))?this.value.match([b]/\d+/[/b]):''; }">

Det där är för att endast tillåta siffror, men hur ska jag göra för att filtrera bort de tecken som inte är okej enl. datummönstret?

Tack!

Peter SMedlem sedan dec. 20025 484 inlägg
#7

Komplext problem ;)

Är det typ så här du menar?

<input type="text" onkeydown="k=this.value" onkeyup="if(!/^\d{0,4}-?\d{0,2}-?\d{0,2}$/.test(this.value)){ this.value=k.replace(/[^-0-9]/g,'') }">
MickeA.comMedlem sedan feb. 20034 528 inlägg
#8

Peter S skrev:

Är det typ så här du menar?[

Jo, nästan ;)

Jag vill alltså att man _endast_ ska kunna ange det här formatet i fältet:

yyyy-mm-dd

Din kod stämmer så långt att man endast kan ange siffror, men i din kod kan man tex ange 200565, vilket inte ska tillåtas.

Det som ska ske är att man måste ange ett datum i "rätt" format, annars ska det tecken man anger suddas ut, precis som i Jojoxx exempel, fast med ett datum.

Peter SMedlem sedan dec. 20025 484 inlägg
#9

Det luriga då är bl.a. följande:

  1. Första gången ett tecken matas in -- hur skall koden bete sig då? En siffra uppfyller ju inte formatet. Detsamma gäller samtliga tecken till dess att formatet stämmer: "2", "20", "200", "2007", "2007-", o.s.v.
  2. Antag att ett korrekt datum matas (2007-10-06) -- vad händer om jag skrivit fel och raderar ett tecken? Formatet uppfylls inte längre.

Hur bör skriptet bete sig i ovanstående situationer?

MickeA.comMedlem sedan feb. 20034 528 inlägg
#10

Aha, då är jag med, kanske det är bättre att isf. köra det som du postade tidigare och kolla med ett mer noggrant mönster när man trycker "spara".

Hur skulle ett sådant, "exakt" mönster kunna se ut?

Aha, såklart... bör ju kunna köra med samma som ovan?

Peter SMedlem sedan dec. 20025 484 inlägg
#11

Jag håller med om att det är bättre att validera då någon klickar på "Spara". Du kan använda följande för att validera indatat:

String.prototype.isValidDate = function()
{
  function leapYear(y){ return y % 400 == 0 || (y % 4 == 0 && y % 100 != 0) }
  if (!/^(\d{4})-(\d{2})-(\d{2})$/.test(this)) return false;
  var y = parseInt(RegExp.$1, 10);
  var m = parseInt(RegExp.$2, 10);
  var d = parseInt(RegExp.$3, 10);
  if (d < 1) return false;
  switch (m){
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
      if (d > 31) return false;
      break;
    case 4: case 6: case 9: case 11:
      if (d > 30) return false;
      break;
    case 2:
      if (d > 28 + leapYear(y)) return false;
      break;
  }
  return true;
}
...
if (!document.myForm.myElement.value.isValidDate()){
  alert("Ogiltigt datumformat")
}
colioneMedlem sedan juni 20013 386 inlägg
#12

Peter S, vore det inte bättre att låta date-objektet avgöra om det är ett skottår? Typ:

function leapYear(y){ return (1===new Date(y,1,29).getMonth())}
Peter SMedlem sedan dec. 20025 484 inlägg
#13

Om det är bättre vet jag inte; smaklökarna får avgöra :bire

MickeA.comMedlem sedan feb. 20034 528 inlägg
#14

Hmm, här har ni svarat utan att jag fått ngra fler mail om det, strange...
Ska testa det där, tack!

Genererad på 487 ms · cache AV · v20260730165559-full.f96bc7eb