webForumDet fria alternativet

Validera datum med regexp

JavaScript

13 svar · 1 004 visningar · startad av monAmour

Medlem sedan dec. 2002258 inlägg
Frågan#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?

Medlem sedan dec. 20025 483 inlägg
#2
/^\d{4}-\d{2}-\d{2}$/

Uttrycket är dock inte optimalt.

:)

Medlem sedan dec. 2002258 inlägg
#3

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

Medlem sedan juni 20004 308 inlägg
#4

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

Medlem sedan dec. 2002258 inlägg
#5

ah just ja

Medlem sedan feb. 20034 441 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!

Medlem sedan dec. 20025 483 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,'') }">
Medlem sedan feb. 20034 441 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.

Medlem sedan dec. 20025 483 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?

Medlem sedan feb. 20034 441 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?

Medlem sedan dec. 20025 483 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")
}
Medlem sedan juni 20014 421 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())}
Medlem sedan dec. 20025 483 inlägg
#13

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

Medlem sedan feb. 20034 441 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!

262 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)