Organizational Research By

Surprising Reserch Topic

validate date format in php using -'php,regex,date,validation'


validate date format in php  using -'php,regex,date,validation'

I'm trying to validate date using PHP.

I'd like following formats to be valid:

d/m/yy
d/m/yyyy
dd/m/yy
dd/m/yyyy
d/mm/yy
d/mm/yyyy
dd/mm/yy
dd/mm/yyyy


I've tried many regular expressions and different variations of checkdate() function. Currently I have something like this:

function _date_is_valid($str)
{
     if(strlen($str) == 0)
         return TRUE;
     if(substr_count($str,'/') == 2)
     {
         if (preg_match("/^((((31\/(0?[13578]|1[02]))|((29|30)\/(0?[1,3-9]|1[0-2])))\/(1[6-9]|[2-9]\d)?\d{2})|(29\/0?2\/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))|(0?[1-9]|1\d|2[0-8])\/((0?[1-9])|(1[0-2]))\/((1[6-9]|[2-9]\d)?\d{2}))/", $str))
         {
             $datearray = explode('/',$str);
             if($datearray[2] > 2030)
                 return FALSE;
             return checkdate($datearray[1], $datearray[0], $datearray[2]);
         }
         else
         {
             return FALSE;
         }
     }
     return FALSE;
}


This however, validates dates like 11/11/200 and 11/11/200#

How can I validate date to match required format?

Edit: I could check datearray[2] to be between 10 and 30 and 2010 and 2030. But is there a way to check it using regex?

Edit1: return TRUE on strlen($str) == 0 is because I want users to be able to add events without knowing when will the event occur so someone else can qualify the schedule and assign event to certain date later



Just for the record. I ended up doing:

function _date_is_valid($str)
{
    if(strlen($str) == 0) //To accept entries without a date
        return TRUE;
    if(substr_count($str,'/') == 2)
    {
        list($d,$m,$y) = explode('/',$str);
        if(($y >= 10 && $y <= 30) || ($y >= 2010 && $y <= 2030))
        {
            return checkdate($m,$d,$y);
        }
    }
    return FALSE;
}


Thanks for all your answers
    

asked Sep 8, 2015 by rajesh
0 votes
7 views



Related Hot Questions

5 Answers

0 votes
If it will always will be date / month / year you can use checkdate: function _date_is_valid($str) { $array = explode('/', $str); $day = $array[0]; $month = $array[1]; $year = $array[2]; $isDateValid = checkdate($month, $day, $year); return $isDateValid; }
answered Sep 8, 2015 by rajesh
0 votes
function _date_is_valid($str) { if (substr_count($str, '/') == 2) { list($d, $m, $y) = explode('/', $str); return checkdate($m, $d, sprintf('%04u', $y)); } return false; }
answered Sep 8, 2015 by rajesh
0 votes
Try this: function _date_is_valid($str) { if (strlen($str) == 0) { return TRUE; } return preg_match('/^(\d{1,2})\/(\d{1,2})\/((?:\d{2}){1,2})$/', $str, $match) && checkdate($match[2], $match[1], $match[3]) && $match[2] <= 2030; }
answered Sep 8, 2015 by rajesh
0 votes
I have been just changing the martin answer above, which will validate any type of date and return in the format you like. Just change the format by editing below line of script strftime("10-10-2012", strtotime($dt)); <?php echo is_date("13/04/10"); function is_date( $str ) { $flag = strpos($str, '/'); if(intval($flag)<=0){ $stamp = strtotime( $str ); }else { list($d, $m, $y) = explode('/', $str); $stamp = strtotime("$d-$m-$y"); } //var_dump($stamp) ; if (!is_numeric($stamp)) { //echo "ho" ; return "not a date" ; } $month = date( 'n', $stamp ); // use n to get date in correct format $day = date( 'd', $stamp ); $year = date( 'Y', $stamp ); if (checkdate($month, $day, $year)) { $dt = "$year-$month-$day" ; return strftime("%d-%b-%Y", strtotime($dt)); //return TRUE; }else { return "not a date" ; } } ?>
answered Sep 8, 2015 by rajesh
0 votes
What I did to validate it was simple function dateValidate($pDate) { if(empty($pDate)) return true; $chDate = date('Y-m-d', strtotime($pDate)); if($chDate != '1970-01-01') return true; else return false; } You can find it out with using regexp too
answered Sep 8, 2015 by rajesh

...