2010-01-18 2 views
15

Sto provando a convalidare la data usando PHP.Convalida il formato della data in php

mi piacerebbe seguenti formati di essere valida:

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

Ho provato molte espressioni regolari e diverse varianti di checkdate function(). Attualmente ho qualcosa di simile:

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; 
} 

Questa data però, convalida date come 11/11/200 e 11/11/200 #

Come posso convalidare per abbinare formato richiesto?

Modifica: Potrei controllare datearray [2] tra 10 e 30 e 2010 e 2030. Ma c'è un modo per controllarlo usando regex?

Edit1: restituisce TRUE su strlen ($ str) == 0 è perché voglio che gli utenti siano in grado di aggiungere eventi senza sapere quando si verificherà l'evento in modo che qualcun altro possa qualificare la pianificazione e assegnare l'evento a una determinata data successiva


Solo per la cronaca. Ho finito per fare:

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; 
} 

Grazie per tutte le vostre risposte

risposta

24
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; 
} 
+0

Dovrebbe essere checkdate(), non check_date(). A parte questo, mi sembra buono. +1 –

+0

se non si controlla il conteggio di '/' si genera un avviso php o avviso su stringhe non valide – antpaw

+0

Ho modificato questo un po 'per non convalidare le date dopo un determinato anno poiché php checkdate() convalida anni come 20111 che in questo caso non è quello che voglio – LukeP

2

provare questo:

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; 
} 
+0

perché return true ? – erenon

+0

Voglio permettere che la data sia lasciata vuota o in un formato valido. È una sorta di calendario degli eventi in cui è possibile prenotare un evento per una certa data o prenotare un evento e qualcun altro assegnerà la data ad esso più tardi – LukeP

+0

Non controlla il giorno o il mese sono validi. –

8

Se sarà sempre sarà data/mese/anno è possibile utilizzare 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; 
} 
+0

Dovrebbe essere checkdate(), non check_date(). E potresti voler fare un isset() per gli indici $ array. A parte questo, mi sembra buono.+1 –

+0

oh sì, hai ragione, è checkdate(), copiato dalla domanda senza verificarlo. Grazie – marvin

+0

Cosa succede se non ci sono due separatori '/'? – Gumbo

0

circa if(strtotime($str) !== FALSE) $valid = TRUE;

+1

-1: OP era molto specifico su quali formati accettare. La tua soluzione consente molti altri formati. –

+1

e c'è anche un problema tra gg/mm/aaaa e mm/gg/aaaa – LukeP

1

Ho appena modificato la risposta di martin sopra, che convaliderà qualsiasi tipo di data e restituirà nel formato che ti piace.

Basta modificare il formato modificando la riga di script in basso 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" ; 
      } 
     } 

    ?> 
1

Quello che ho fatto per la convalida è stato semplice

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; 
} 

Potete scoprirlo con l'utilizzo di espressioni regolari troppo

4

un modo semplice per fare questo

<?php 
    if(!$formated_date = date_create_from_format('Y-m-d',$dateVar)) 
+1

La tua stella mi ha aiutato molto. Buon lavoro – humphrey