2012-02-15 12 views
7

Może ktoś pokazać mi błąd z moich sposobów, jeśli chodzi o tego wyrażenia regularnego:Regular Expression Pomoc dla Data Validation - dd/mm/rrrr - PHP

if(preg_match("/^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$/", $_POST["date"]) === 0) { 
    echo 'error'; 
} 

Zasadniczo chcę tego, aby wyświetlić komunikat o błędzie za każdym razem - chyba że format jest poprawny (dd/mm/rrrr).

Co robię źle z powyższymi?

Wielkie dzięki za wszelkie wskazówki.

- zaktualizowane regex powyżej wkrótce po nadaniu - przeprosiny za niedogodności -

+1

użytkowania online tester regexp ex. http://www.regexpal.com/ – betontalpfa

Odpowiedz

15

myślę, że należy uciec ukośniki /^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/

+0

Wielkie dzięki za to. Wkrótce zazielękuję :) – michaelmcgurk

+0

dziękuję. ta praca również dla mnie. Głosowałeś. –

4

Musisz uciec ukośnik ponieważ używasz go jako regex ogranicznika

/^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/ 

lub użyć innego regex ograniczniki

#^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$# 
+0

Fantastyczne. To teraz działa idealnie. Głupek mnie :) – michaelmcgurk

4

Można również użyć tego:

([0-2]\d|3[0-1])\/(0\d|1[0-2])\/(19|20)\d{2} 

jeśli chcesz rozróżniać między datami i miesiącach, ale także potwierdzić tylko 2 stuleci.

+0

A jeśli potrzebujesz uchwycić '^ ([0-2] \ d | 3 [0-1]) \/(0 \ d | 1 [0-2]) \/((? | 20) \ d {2}) $ ', a także dodaliśmy początkowe i końcowe kotwice. Również jest błąd, który datuje się na zero dnia, a miesiąc będzie działał "00/00/1999". –

2

Używam tego do sprawdzania dat

private function validate_date($date, $empty_allowed = true) { 

    if (empty($date)) { 
     return $empty_allowed; 
    } 

    if (! strpos($date, '/')) { 
     return false; 
    } 

    if (substr_count($date, '/') !== 2) { 
     return false; 
    } 

    if (preg_match('/(0[1-9]|1[0-9]|3[01])\/(0[1-9]|1[012])\/(2[0-9][0-9][0-9]|1[6-9][0-9][0-9])/', $date) !== 1) { 
     return false; 
    } 

    $split = explode('/', $date); 

    return checkdate($split[1], $split[0], $split[2]); 

}