2014-12-20 19 views
6

Ho un metodo php che controlla se un parametro passato è una data. Qui è tutto:is_date() non funziona correttamente

public function is_Date($str){ 
     if (is_numeric($str) || preg_match('^[0-9]^', $str)){ 
      $stamp = strtotime($str); 
      $month = date('m', $stamp); 
      $day = date('d', $stamp); 
      $year = date('Y', $stamp); 
      return checkdate($month, $day, $year); 
     } 
     return false; 
} 

allora, i test-guidato in questo modo:

$var = "100%"; 

if(is_Date($var)){ 
    echo $var.' '.'is a date'; 
} 

$var = "31/03/1970"; 

if(is_Date($var)){ 
    echo $var.' '.'is a date'; 
} 

$var = "31/03/2005"; 

if(is_Date($var)){ 
    echo $var.' '.'is a date'; 
} 

$var = "31/03/1985"; 

if(is_Date($var)){ 
    echo $var.' '.'is a date'; 
} 

Si noti che ciascuna delle IFS ha anche un else come in:

else{ 
    echo $var.' '.'is not a date' 
} 

USCITA:

100% is a Date 
31/03/1970 is a Date 
31/03/2005 is a Date 
31/03/1985 is a Date 

Il mio problema è, perché è Visualizzazione al 100% come data e perché 31/03/1985 non viene letto come una data?

Qualsiasi indizio sul perché saranno molto apprezzati come io non sono troppo competenza Regex

+0

Perché non semplicemente controllare: 'is_numeric (strtotime ($ str)) '? – hjpotter92

+0

cosa intendi in '^ [0-9] ^'? –

risposta

-1

mi piacerebbe farlo ora! la nuova produzione ha coltivato a gradini la visualizzazione al 100% come una data, che era quello che planned.here è il sippette codice finale che fa il lavoro:

public function is_Date($str){ 
 
     
 
     $str = str_replace('/', '-', $str);  
 
     $stamp = strtotime($str); 
 
     if (is_numeric($stamp)){ 
 
      
 
      $month = date('m', $stamp); 
 
      $day = date('d', $stamp); 
 
      $year = date('Y', $stamp); 
 
      
 
      return checkdate($month, $day, $year); 
 
       
 
     } 
 
     return false; 
 
    } 
 

 

 

 
echo a million thanks to you all ! you guys are the best !

+3

Per favore, non aggiungere la stessa risposta. Dovresti invece accettare [risposta] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). –

3

si utilizza ^ alla fine della stringa regex, Significato ^ è quello di confrontare inizio di corda.

Inoltre, come hjpotter92 suggerito, si può semplicemente utilizzare is_numeric(strtotime($str))

La funzione dovrebbe essere simile:

public function is_Date($str){ 
    $str=str_replace('/', '-', $str); //see explanation below for this replacement 
    return is_numeric(strtotime($str))); 
} 

Documentation says:

date nel m/d/y o dmy i formati sono disambiguati guardando il separatore tra i vari componenti: se il separatore è una barra (/), viene assunto l'americano m/d/y; mentre se il separatore è un trattino (-) o un punto (.), si assume il formato europeo d-m-y.

+3

Il '^' OP era costituito da delimitatori, che hai dimenticato nella funzione 'preg'. – hjpotter92

+0

@ hjpotter92, grazie per il suggerimento! –

+0

mi piacerebbe farlo funzionare ora! il nuovo output ha smesso di mostrare il 100% come data, che era ciò che avevo pianificato ......... –

Problemi correlati