preg_replace - split php
PHP preg_match con regex de trabajo (4)
¿Por qué usar regex? Use la clase DateTime .
function validateDate($date, $format = ''Y-m-d H:i:s'')
{
$d = DateTime::createFromFormat($format, $date);
return $d && $d->format($format) == $date;
}
Puede usar esta función para todo tipo de validaciones de fecha / hora. Ejemplos:
var_dump(validateDate(''2012-02-28 12:12:12'')); # true
var_dump(validateDate(''2012-02-30 12:12:12'')); # false
var_dump(validateDate(''2012-02-28'', ''Y-m-d'')); # true
var_dump(validateDate(''28/02/2012'', ''d/m/Y'')); # true
var_dump(validateDate(''30/02/2012'', ''d/m/Y'')); # false
var_dump(validateDate(''14:50'', ''H:i'')); # true
var_dump(validateDate(''14:77'', ''H:i'')); # false
var_dump(validateDate(14, ''H'')); # true
var_dump(validateDate(''14'', ''H'')); # true
var_dump(validateDate(''2012-02-28T12:12:12+02:00'', ''Y-m-d/TH:i:sP'')); # true
# or
var_dump(validateDate(''2012-02-28T12:12:12+02:00'', DateTime::ATOM)); # true
var_dump(validateDate(''Tue, 28 Feb 2012 12:12:12 +0200'', ''D, d M Y H:i:s O'')); # true
# or
var_dump(validateDate(''Tue, 28 Feb 2012 12:12:12 +0200'', DateTime::RSS)); # true
var_dump(validateDate(''Tue, 27 Feb 2012 12:12:12 +0200'', DateTime::RSS)); # false
# ...
Esta pregunta ya tiene una respuesta aquí:
- Validar formato de fecha en php 7 respuestas
function validateDate( $date )
{
echo $date;
//2012-08-24 20:30:00
if(preg_match(''/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/'', $date) >= 1)
{
return true;
}
else
{
return false;
}
}
Esto siempre devuelve falso. Usé una única herramienta para construir la expresión regular y funcionaba bien allí. El problema comenzó cuando agregué el "/" a la expresión regular. De alguna manera, PHP parece requerir estos, pero no sé por qué y no sé por qué se rompe mi expresión regular.
Debería volverse VERDADERO por algo. como "2012-08-24 20:30:00" y FALSO para "asdf2012-08-24 20: 30: 00asdf" o cualquier cosa que no esté de acuerdo con mi expresión regular
¡Gracias por adelantado!
----------------------- EDITAR ¡Gracias por todas sus respuestas!
Como algunos usuarios señalaron, mi función devuelve verdadera para la fecha de muestra "2012-08-24 20:30:00". Sin embargo, solo lo hace si configuro manualmente $ date = ''2012-08-24 20:30:00''. Si llamo a la función en cualquier lugar de mi código con la misma cadena exacta, devuelve falso. ¿Alguien sabe por qué?
----------------------- EDIT2
Sí, lo siento por perder el tiempo, de hecho, se agregó un espacio en blanco a la cuerda. Usar trim () en mi fecha antes de llamar a mi función da el resultado correcto ahora.
¡gracias a todos!
Devuelve true
para mí. Prueba esta expresión regular en su lugar:
function validateDate($date) {
echo $date;
if( !preg_match("/^(/d{4})-(/d{2})-(/d{2}) (/d{2}):(/d{2}):(/d{2})$/",$date,$m)) return false;
if( !checkdate($m[1],$m[2],$m[0])) return false;
if( $m[3] > 23) return false;
if( $m[4] > 59) return false;
if( $m[5] > 59) return false;
return true;
}
Es más fácil validar el formato en RegEx, seguido de validar el contenido con funciones específicas, que tratar de hacer todo en RegEx.
Esto debería funcionar mejor, y ser escrito más simple:
function validateDate($date)
{
return preg_match(''/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/'', $date);
}
Sin embargo, volverá a ser cierto con 9999-99-99 29:59:59
como otros mencionaron ...
Desde el manual de PHP, puede encontrar fácilmente soluciones más elegantes y confiables, por ejemplo (inspiradas en este comentario ):
function validateDate($data)
{
return (date(''Y-m-d H:i:s'', strtotime($data)) == $data);
}
Lo que estás preguntando son los delimitadores. Lea este artículo en el manual de PHP.net: RegExp - Delimitadores
Cuando se utilizan las funciones de PCRE, se requiere que el patrón esté delimitado por delimitadores . Un delimitador puede ser cualquier carácter no alfanumérico, no de barra invertida ni de espacio en blanco.
Y:
Los delimitadores utilizados a menudo son barras diagonales (/), signos de almohadilla (#) y tildes (~). Los siguientes son todos ejemplos de patrones delimitados válidos.