Domanda

Qual è il modello RegEx per DateTime (2008-09-01 12:35:45)?

Ottengo questo errore:

Nessun delimitatore finale '^' trovato

Utilizzando:

preg_match('(?n:^(?=\d)((?<day>31(?!(.0?[2469]|11))|30(?!.0?2)|29(?(.0?2)(?=.{3,4}(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])(?<sep>[/.-])(?<month>0?[1-9]|1[012])\2(?<year>(1[6-9]|[2-9]\d)\d{2})(?:(?=\x20\d)\x20|$))?(?<time>((0?[1-9]|1[012])(:[0-5]\d){0,2}(?i:\ [AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$)', '2008-09-01 12:35:45');

Dà questo errore:

Avvertimento:preg_match() [funzione.preg-match]:Compilazione non riuscita:niente da ripetere all'offset 0 in E:\www\index.php alla riga 19

È stato utile?

Soluzione

@Espo:Devo solo dire che la regex è incredibile.Mi dispiacerebbe dover scrivere il codice che fa qualcosa di utile con le corrispondenze, ad esempio se volessi scoprire effettivamente quale data e ora ha digitato l'utente.

Sembra che la soluzione di Tom sarebbe più sostenibile, poiché è circa un milione di volte più semplice e con l'aggiunta di alcune parentesi puoi facilmente ottenere i valori digitati dall'utente:

(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})

Se stai usando Perl, puoi ottenere i valori con qualcosa del genere:

$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;

Altre lingue avranno una capacità simile.Tieni presente che dovrai apportare alcune modifiche minori alla regex se desideri accettare valori come i mesi a una cifra.

Altri suggerimenti

Una versione semplice che funzionerà per il formato menzionato, ma non per tutti gli altri come da @Espos:

(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) 

http://regexlib.com/REDetails.aspx?regexp_id=610

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(? =.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][ 26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]| 1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2 -9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0- 5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2}) ?$


Ciò convalida entrambi i modelli di date e/o tempi.Giorni di febbraiosono anche validati per anni di salto.Date:in formato DD/MM/YYYY o D/M/YY tra 1/1/1600 - 31/12/9999.I principali zero sono opzionali.I separatori di date possono essere corrispondenti trattini (-), tagli (/) o periodi (.) Times:In HH: MM: SS AM/PM Formato 12 ore (12:00 - 23:59:59 PM) o HH: MM: SS Military Time Formato (00:00:00 - 23:59:59).Il formato di 12 ore:1) può avere uno zero leader per l'ora.2) I minuti e i secondi sono facoltativi per il formato di 12 ore 3) AM o PM è richiesto e sensibile al caso.Tempo militare 1) deve avere uno zero leader per tutte le ore inferiori a 10.2) I minuti sono manditori.3) i secondi sono facoltativi.Date e orari:Combinazione dei formati di cui sopra.Una data prima poi un'ora separata da uno spazio.Ex) DD/MM/YYYY HH: MM: SS


Modificare:Assicurati di copiare RegEx dal sito Web regexlib.com poiché StackOverflow a volte rimuove/distrugge caratteri speciali.

^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1]))$|^([2][0]\d{2}\/([0]\d|[1][0-2])\/([0-2]\d|[3][0-1])\s([0-1]\d|[2][0-3])\:[0-5]\d\:[0-5]\d)$
$date = "2014-04-01 12:00:00";

preg_match('/(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/',$date, $matches);

print_r($matches);

$match saranno:

Array ( 
   [0] => 2014-04-01 12:00:00 
   [1] => 2014 
   [2] => 04 
   [3] => 01 
   [4] => 12 
   [5] => 00 
   [6] => 00
)

Un modo semplice per suddividere una stringa formattata con data e ora.

Per quanto riguarda la risposta di Imran dal 1 ° settembre 2008 alle 12:33 c'è una scomparsa:Nel modello sono i modelli corretti

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m1);
print_r( $m1 );
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45', $m2);
print_r( $m2 );
preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45', $m3);
print_r( $m3 );

questo ritorna

Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 )
Array ( [0] => 2008-09-01 12:35:45 ) 

Ecco la mia soluzione:

/^(2[0-9]{3})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01]) (0[0-9]|1[0-9]|2[0123])\:([012345][0-9])\:([012345][0-9])$/u

Ho modificato il modello regex da http://regexlib.com/REDetails.aspx?regexp_id=610.Il seguente modello dovrebbe corrispondere al tuo caso.

^(?=\d)(?:(?:1[6-9]|[2-9]\d)?\d\d([-.\/])(?:1[012]|0?[1-9])\1(?:31(?<!.(?:0[2469]|11))|(?:30|29)(?<!.02)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

AAAA-MM-GG HH:MM:SS

Le funzioni di preg PHP richiedono che la tua espressione regolare sia racchiusa in un carattere delimitatore, che può essere qualsiasi carattere.Non puoi utilizzare questo carattere delimitatore senza eseguire l'escape all'interno della regex.Questo dovrebbe funzionare (qui il carattere delimitatore è /):

preg_match('/\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

// or this, to allow matching 0:00:00 time too.
preg_match('/\d{4}-\d{2}-\d{2} \d{1,2}:\d{2}:\d{2}/', '2008-09-01 12:35:45');

Se devi abbinare righe che contengono solo datetime, aggiungi ^ e $ all'inizio e alla fine della regex.

preg_match('/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/', '2008-09-01 12:35:45');

Collegamento a preg_match() del manuale PHP

Ecco una versione semplificata (originata dalla risposta di Espo).Controlla la correttezza della data (anche dell'anno bisestile) e hh:mm:ss è facoltativo
Esempi che funzionano:
- 31/12/2003 11:59:59
- 29-2-2004

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))(|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

Ecco la mia soluzione:

[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]) ([01][0-9]|2[0-3]):[0-5]\d

Regular expression visualization

Demo di debug

https://regex101.com/r/lbthaT/4

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top