---
title: "reguljära uttryck (igen)"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/109509-reguljära-uttryck-igen"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Patrik81"
published: "2004-08-18T10:22:04.000Z"
updated: "2009-02-21T19:18:17.000Z"
replies: 16
views: 653
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/109509-reguljära-uttryck-igen"
---

# reguljära uttryck (igen)

## #1 — Patrik81, 2004-08-18T10:22Z

Hejsan, nu sitter jag här med ett nytt problem igen.

Jag försökte skriva ett uttyck för att kontrollera en datumsträng. Det funkade nästan, men med några större fel.

Antagligen har jag skrivit den helt åt helsike fel, så jag bifogar både den, och skriver vad målet är, i hopp om att någon antingen kan skriva om den, eller kan hitta ett smartare sätt att göra det på.

```
19|2[01]{1}[0-9]{2}-{1}
0[1-9]|1[0-2]{1}-{1}
(0[1-9]|[12][0-9]|3[0-2]){1}-{1}
([01][0-9]|2[0-3]){1}:{1}
((0[1-9]|[1-5][0-9]){1}:?){2}
```

(Har allt på en rad i scriptet, men kortade av den här så att den inte blir så hiskeligt lång.

Målet är alltså att kolla att ett datum ligger inom
1900-01-01 00:00:00
och
2199-12-31 23:59:59

Datumsträngen kommer alltså alltid att vara 19 tecken lång.

Just nu så validerar mitt uttryck även datum såsom 1900-00-00 24:60:60 och det är lite kass, för varken månad eller dag noll finns ju, och 24:60:60 skall ju vara 00:00:00 så det borde inte heller gå igenom.

Någon som orkar hjälpa mig?

MVH Patrik

Permalänk: https://www.webforum.nu/p/109509

## #2 — Hansen, 2004-08-18T10:47Z

Verkar som du försöker göra det mer komplicerat än var det är.

Använd ett enklare regexp och validera efter du matchat.

```
/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})/
```

Permalänk: https://www.webforum.nu/p/1415733

## #3 — kobranturre, 2004-08-18T10:51Z

> **Hansen skrev:**
>
> Verkar som du försöker göra det mer komplicerat än var det är.
> 
> Använd ett enklare regexp och validera efter du matchat.
> 
>
>
> ```
> /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})/
> ```

koden kommer inte funka...du kommer kunna skriva tex

2199-12-31 23:59:59 vilket är OK men även

9199-12-31 23:59:59 vilket den inte ska acceptera

Permalänk: https://www.webforum.nu/p/1415735

## #4 — kobranturre, 2004-08-18T11:03Z

prova denna...jag är dock inte 100% säker

```php
/^(19|2[01]){1}([0-9]){2}(-){1}(0[0123456789]|1[012]){1}(-){1}(0[123456789]|1[0123456789]|2[0123456789]|3[01]){1}([ ]){1}(0|1|2){1}([0-9]){1}([:]){1}([0-5]){1}([0-9]){1}([:]){1}([0-5]){1}([0-9]){1}$/
```

observera att man kan skriva in 02.31 (31a februari). Men som vi vet så har inte februari så många dagar :)  . Jag är inte en tillräckligt advancerad programmerare för att fixa det ;) 

Kanske skulle du kunna ha 4 olika if satser som kollar vad det är för månad och kör olika regexp. 1 för 31 dgar. 1 för 30, 1 för 28 och en som kör för 29dagar (skottår)

Permalänk: https://www.webforum.nu/p/1415742

## #5 — Hansen, 2004-08-18T11:11Z

> **kobranturre skrev:**
>
> > **Hansen skrev:**
> >
> > Verkar som du försöker göra det mer komplicerat än var det är.
> > 
> > Använd ett enklare regexp och validera efter du matchat.
> > 
> >
> >
> > ```
> > /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})/
> > ```
>
> 
> 
> koden kommer inte funka...du kommer kunna skriva tex
> 
> 2199-12-31 23:59:59 vilket är OK men även
> 
> 9199-12-31 23:59:59 vilket den inte ska acceptera

```
<?php

if ( validate_datetime("2004-08-18 12:35") ) {
    echo "Goodie!\n";
}

function validate_datetime($date) {
    
    if ( preg_match("/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})/", $date, $matches ) ) {
            
        #year
        if ( !( $matches[1] > 1900 and $matches[1] < 2199 ) ) {
            return false;
        }
        
        # osv...
        
        return true;
    }

    return false;
}
?>
```

redigering: tog bort den sista onödiga else satsen

Permalänk: https://www.webforum.nu/p/1415747

## #6 — kobranturre, 2004-08-18T11:34Z

Koden fungerar iaf inte

/(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2})/

säger:

4siffror-2siffror-2siffror 2siffror:2siffror:2siffror 

dvs den skulle godkänna

9999-99-99 99:99:99

då måste du använda if-satser till

årtalet
månaden
dagen
timmen
minuten
sekunden 

med andra ord: Allt

Permalänk: https://www.webforum.nu/p/1415757

## #7 — Erik Juhlin, 2004-08-18T11:37Z

> **kobranturre skrev:**
>
> koden kommer inte funka...du kommer kunna skriva tex
> 
> 2199-12-31 23:59:59 vilket är OK men även
> 
> 9199-12-31 23:59:59 vilket den inte ska acceptera

Hansen skrev ju "validera efter du matchat.". Och jag håller med Hansen.

Permalänk: https://www.webforum.nu/p/1415759

## #8 — Erik Juhlin, 2004-08-18T11:38Z

Förresten har inte PHP något inbyggt för att kolla sånt här?
Blir ju ganska kluddigt att hålla på och kolla om det är skottår och liknande.

Permalänk: https://www.webforum.nu/p/1415760

## #9 — Hansen, 2004-08-18T11:40Z

> **kobranturre skrev:**
>
> Koden fungerar iaf inte
> /(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2})/

Jag missade sekunderna, bättre?

```
<?php

if ( validate_datetime("2004-08-18 12:35:00") ) {
    echo "Goodie!\n";
}

function validate_datetime($date) {
    
    if ( preg_match("/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $date, $matches ) ) {
            
        #year
        if ( !( $matches[1] >= 1900 and $matches[1] <= 2199 ) ) {
            return false;
        }

        #month
        if ( !( $matches[2] >= 1 and $matches[2] <= 12 ) ) {
            return false;
        }

        #day
        if ( !( $matches[3] >= 1 and $matches[3] <= 31 ) ) {
            return false;
        }
        
        #hour
        if ( !( $matches[4] >= 1 and $matches[4] <= 24 ) ) {
            return false;
        }        

        #minute
        if ( !( $matches[5] >= 0 and $matches[5] <= 59 ) ) {
            return false;
        }
        
        #second
        if ( !( $matches[6] >= 0 and $matches[6] <= 59 ) ) {
            return false;
        }
        
        #check date
        if ( !( checkdate( $matches[2], $matches[3], $matches[1] ) ) ) {
            return false;
        }
        
        return true;
    }

    return false;
}

?>
```

Permalänk: https://www.webforum.nu/p/1415761

## #10 — kobranturre, 2004-08-18T11:41Z

> **Hansen skrev:**
>
> > **kobranturre skrev:**
> >
> > Koden fungerar iaf inte
> > /(\\d{4})-(\\d{2})-(\\d{2}) (\\d{2}):(\\d{2})/
>
> 
> 
> Jag missade sekunderna, bättre?
> 
>
>
> ```
> <?php
> 
> if ( validate_datetime("2004-08-18 12:35:00") ) {
>     echo "Goodie!\n";
> }
> 
> function validate_datetime($date) {
>     
>     if ( preg_match("/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/", $date, $matches ) ) {
>             
>         #year
>         if ( !( $matches[1] >= 1900 and $matches[1] <= 2199 ) ) {
>             return false;
>         }
> 
>         #month
>         if ( !( $matches[2] >= 1 and $matches[2] <= 12 ) ) {
>             return false;
>         }
> 
>         #day
>         if ( !( $matches[3] >= 1 and $matches[3] <= 31 ) ) {
>             return false;
>         }
>         
>         #hour
>         if ( !( $matches[4] >= 1 and $matches[4] <= 24 ) ) {
>             return false;
>         }        
> 
>         #minute
>         if ( !( $matches[5] >= 0 and $matches[5] <= 59 ) ) {
>             return false;
>         }
>         
>         #second
>         if ( !( $matches[6] >= 0 and $matches[6] <= 59 ) ) {
>             return false;
>         }
>         
>         #check date
>         if ( !( checkdate( $matches[2], $matches[3], $matches[1] ) ) ) {
>             return false;
>         }
>         
>         return true;
>     }
> 
>     return false;
> }
> 
> ?>
> ```

haha...jooo :)

Permalänk: https://www.webforum.nu/p/1415763

## #11 — kobranturre, 2004-08-18T11:43Z

föresten hoppas du inte tog illa upp Hansen. Inget illa menat

Permalänk: https://www.webforum.nu/p/1415764

## #12 — Hansen, 2004-08-18T11:52Z

Verkade som jag klantade till mig ;). 

Jag valde citera istället för att redigera, kommande inlägg det rätta!

Permalänk: https://www.webforum.nu/p/1415766

## #13 — Hansen, 2004-08-18T12:05Z

> **Erik Juhlin skrev:**
>
> Förresten har inte PHP något inbyggt för att kolla sånt här?
> Blir ju ganska kluddigt att hålla på och kolla om det är skottår och liknande.

Det var snack om att införa [strptime](http://www.freebsd.org/cgi/man.cgi?query=strptime&sektion=3) funktionen från libc, men den har inte dykt upp än :(

> **kobranturre skrev:**
>
> föresten hoppas du inte tog illa upp Hansen. Inget illa menat

Det gjorde jag inte :)

redigering: Jag råkade länka strptime till [strftime](http://www.freebsd.org/cgi/man.cgi?query=strftime&sektion=3).

Permalänk: https://www.webforum.nu/p/1415779

## #14 — kobranturre, 2004-08-18T12:12Z

det där med skottår är faktiskt inte så svår o fixa

använd dig av split på hela strängen..splitta vid -   

<http://se.php.net/split>

sedan så gör du tex $resultat = årtalet/4

använd dig sedan av gettype()

<http://se.php.net/gettype>

och kolla om talet är heltal eller flyttal. Om $resultat = "integer" så är det skottår :)

edit: Jag skrev fel...det skulle vara / och inte %

Permalänk: https://www.webforum.nu/p/1415785

## #15 — Hansen, 2004-08-18T12:33Z

> **kobranturre skrev:**
>
> det där med skottår är faktiskt inte så svår o fixa

```
function is_leap($year) {
    if ( ( $year % 400 ) == 0 ) { return true; }
    if ( ( $year % 100 ) == 0 ) { return false; }
    if ( ( $year % 4 ) == 0 ) { return true; }
    return false;
}
```

Eller så är man lat som jag och använder [checkdate](http://php.net/checkdate) funktionen för att validera datum.

Permalänk: https://www.webforum.nu/p/1415793

## #16 — Patrik81, 2004-08-18T13:10Z

Tack allihop, inte trodde jag väl att detta skulle bli en sådan jättediskussion :) Koden ovan funkade utmärkt, jag ändrade dock på timmarna så att den kan vara noll, och bara upp till 23 (tycker 00:00:00 ser snyggare ut än 24:00:00)

Många tack för suverän insats.
MVH Patrik

Permalänk: https://www.webforum.nu/p/1415831

## #17 — MickeA.com, 2009-02-21T19:18Z

Snor den här tråden för jag har ett liknande problem.

Använder följade för att validera datum (yyyy-mm-dd):

```
if(!isset($invoice_date) || !preg_match("/^(19|20)[0-9]{2}[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$/", $invoice_date, $iD)){
	$error[] = "Du angav inte ett giltigt fakturadatum";
}
```

Men den godtar t.ex. inte "2009-01-01".
Vad är fel i mönstret ovan?

Tack!

Permalänk: https://www.webforum.nu/p/2169827

---

Tråden på webben: https://www.webforum.nu/amne/php/109509-reguljära-uttryck-igen
