20. juli 2004 - 11:32Der er
11 kommentarer og 1 løsning
Genkendelse af år, måned og dag. Hvordan?
Hej Eksperter
Da jeg absolut ikke er den store haj til reg-exp vil jeg lige forhøre mig her. Om ikke andet kan det jo være, at Erik kigger forbi ;)
Jeg skal - i forbindelse med et nyhedssystem - have lavet en "parser", der kan genkende en dato. Det er i og for sig ret nemt, og følgende skulle gerne give et indblik i, hvilke mønstre, der skal matches på:
1) Kun årstal: YYYY = 2000 -> indeværende år (date('Y')) 2) År og måned: YYYY/m = [ovenstående]/1 -> 12 3) Fuld dato: YYYY/m/d = [ovenstående]/1 -> 31
Om datoen er ugyldig (eks. 2004/2/31 (31. feb. ?!?) er underordnet - det kan jeg selv kontrollere bagefter.
Det eneste jeg vil have er et match (ereg eller preg_match - hvad ved jeg?) der indeholder 0-3 elementer:
0: Der var ikke engang et årstal fra mønster 1) 1: Årstal fra mønster 1) 2: Årstal og måned fra mønster 2) 3: Årstal, måned og dag fra mønster 3)
Umiddelbart vil jeg skyde på, at man skal hen i retning af:
ereg('^(([2000-' . date('Y') . '])(\/[1-12](\/[1-31])?)?)?$', $dato, $parts); // kan man overhovedet det med intervaller som [2000-2004] ??? men hvis preg_match er bedre, så er det helt fint. Dem kan jeg bare slet ikke greje.
På forhånd tak - Jens Gram
PS: Sproget er PHP, hvis nogen skulle være i tvivl (men det er vel ligemeget)
PPS: Hvis man ikke kan lave range's som [2000-2004], så er det ok, at der blot bliver kontrolleret for et 2-tal og et 0 efterfulgt af to tal ( 20[0,9]{2} ) osv.
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Den gale ting, jeg kan se i din regexp er den du selv er tvivlende overfor nemlig intervallet, som man ikke kan ...
[2000-2004] betyder nemlig 2, 0, 0, 0-2, 0, 0 eller 4, altså enten 0,1,2 eller 4 ...
-- der er også noget med dine paranteser, som jeg ikke kan gennemskue, men jeg ville så også bruge en replace til at hive værdierne ud, og umiddelbart tror jeg ikke du kan lave det i eet hug, du skal ud i to ...
Det er ok - den overdrevne brug af parenteser skyldes, at jeg så får "pæne" data som eks. [3]=> string(2) "12" i stedet for [2]=> string(3) "/12" som måned.
Tak for hjælpen, roenving. Det hjalp mig på sporet.
Ja, en regexp er som udgangspunkt greedy, det vil sige, at den prøver at finde så lang en match, som overhovedet mulig, så man skal altid teste for den længste mulighed først !-)
Så også jeg fik lige sparket noget ind i baghovedet !o]
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.