9

Can someone show me the error of my ways when it comes to this regular expression:

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

Basically I want this to display an error message each time - unless the format is correct (dd/mm/yyyy).

What am I doing wrong with the above?

Many thanks for any pointers.

-- updated regex above shortly after posting - apologies for inconvenience --

michaelmcgurk
  • 6,367
  • 23
  • 94
  • 190

5 Answers5

19

I think you should escape the slashes /^[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{4}$/

iDifferent
  • 2,190
  • 1
  • 14
  • 19
4

You can also use this one:

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

if you want to differentiate between dates and months, but also validate only 2 centuries.

Academia
  • 3,984
  • 6
  • 32
  • 49
  • And if you need to capture `^([0-2]\d|3[0-1])\/(0\d|1[0-2])\/((?:19|20)\d{2})$` and also have added begining and ending anchors. Also there is a bug that dates with zero day and month will work '00/00/1999'. – happy_marmoset Nov 02 '16 at 07:28
4

You need to escape the slash since you are using it as regex delimiter

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

or use different regex delimiters

#^[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}$#
stema
  • 90,351
  • 20
  • 107
  • 135
2

I use this for checking dates

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] );

}
Emil Rosenius
  • 961
  • 1
  • 9
  • 24
0

This is the easiest way to solve your problem.

^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$

Output looks Like=> 31/12/2019

Test Demo

A.A Noman
  • 5,244
  • 9
  • 24
  • 46