login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Regex DD/MM/YYYY

Offline finduilas - 15/10/2014 11:39
Avatar van finduilasPHP gevorderde Hallo

Ik haat regexxen, heb er steeds problemen mee. Ik probeer te controleren op een geldige datum als dd/mm/yyyy.

Alleen moet er iets meer controle op, zoals
/ - moet ook kunnen als splitter
01 tot 12 als maand
01 tot 31 als datum

Ik dacht het even op te zoeken maar vind niets die werkt? Aanpassen enz heb ik geprobeerd, maar heeft niets opgeleverd..

  1. //patternDate = new RegExp("/^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/");


Iemand die beter is in regexen  ?

4 antwoorden

Gesponsorde links
Offline Thomas - 15/10/2014 11:57 (laatste wijziging 15/10/2014 12:04)
Avatar van Thomas Moderator Splits het probleem.

Controleer eerst de vorm met een regexp.

Controleer dan de betekenis.

Tevens: je bent niet de enige met dit probleem, dus een simpele Google zoektocht had je al bij stackoverflow doen laten uitkomen.

EDIT: Of je gebruikt een library zoals de datepicker van jQuery, die heeft ook een controle voor een geldige datum.
Offline finduilas - 15/10/2014 13:13
Avatar van finduilas PHP gevorderde Ik ben inderdaad al op stackoverflow beland.. Maar het gaf geen werkend resultaat. Bovendien wat jij geeft is een MM/DD/YYYY. ;). Het is DD/MM/YYYY

Deze is bijvoorbeeld voor mm/dd/yyyy
  1. var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/ ;


Als ik dit aanpas kom ik dit uit:
  1. var date_regex = /^(0[1-9]|1\d|2\d|3[01])\/(0[1-9]|1[0-2])\/(19|20)\d{2}$/ ;


In principe zou dit moeten werken... Maar als ik dan uitbreid met [\/\-] loopt het verkeerd..

P.S. Ik werk met een JS plugin, maar die zijn niet voldoende en controleren meestal enkel op mm/dd/yyyy of yyyy/mm/dd. Omdat de rest wel goed gaat en daar verder te kunnen in werken heb ik een regex nodig om een eigen controle te schrijven.

Hmmz, een opsplitsing zit er mogelijks wel in.. Of toch niet..
Ik kan controleren dat het XX/XX/XXXX is.. Maar dan moet ik toch nog altijd de volledige controle hebben dat het bv niet meer dan 12 is?
Offline Thomas - 15/10/2014 14:22
Avatar van Thomas Moderator Ja, daarom gaf ik al aan dat je de controle moet splitsen .

Enerzijds controleer je een patroon: NN/NN/NNNN (met N een cijfer van/met 0 tot/met 9).

Aan de andere kant moeten die stukken aan een bepaald interval voldoen:
De eerste NN (als je dd/mm/yyyy aanhoudt) moet tussen 01 en 31 zitten, daarnaast heeft deze extra condities op grond van maand en schrikkeljaar.
De tweede NN moet tussen 01 en 12 zitten.
En NNNN hangt af wat je als zinnig jaartalbereik beschouwt.

Die oplossing (met omwisseling van dd en mm) stond exact op stackoverflow. Waarom het wiel opnieuw uitvinden?

Daarnaast heb je misschien nog andere condities als "mag niet in het verleden vallen" (bijvoorbeeld voor een afspraak) of "mag niet in de toekomst vallen" (bijvoorbeeld voor een geboortedatum).

Ik hoop trouwens niet dat je datums zo opgeslagen hebt in een database ofzo? Gebruik hiervoor DATE, DATETIME of zelfs een UNIX timestamp, alles is beter dan voorgeformatteerde opmaak. Het beste is om het formatteren van data (niet alleen datums ) zo lang mogelijk uit te stellen. Bij voorkeur doe je dit dus pas bij het afdrukken ervan, zodat je te allen tijde het format eenvoudig kunt veranderen.
Offline finduilas - 15/10/2014 14:43
Avatar van finduilas PHP gevorderde Ik bekijk het even hoe ik dat implementeer in die plugin. Uiteindelijk moet dit wel lukken ;). Ik doe eerst een regex en daarna de geldigheid (+ extra dingen, want het is inderdaad voor een geboortedatum).

BTW: Ik sla ze op als DATE in de DB.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.22s