regulares preg_replace preg_match online expresiones especiales caracteres php preg-match

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í:

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.