Espressione regolare per abbinare le date in formato YYYY-MM-DD
-
19-09-2019 - |
Domanda
Ho un'espressione regolare in PHP che cerca la data nel formato di yyyy-mm-dd
Quello che ho è: [\d]{4}-[\d]{2}-[\d]{2}
Sto usando preg_match per testare la data, il problema è quello 2009-11-10
funziona, ma 2009-11-1033434
funziona anche. È passato un po 'di tempo da quando ho fatto Regex, come posso assicurarmi che si fermi nel punto corretto? Ho provato a farlo /([\d]{4}-[\d]{2}-[\d]{2}){1}/
, ma restituisce lo stesso risultato.
Qualsiasi aiuto sarebbe molto apprezzato.
Soluzione
Ciò di cui hai bisogno sono le ancore, in particolare ^
e $
. Il primo corrisponde all'inizio della stringa, il secondo corrisponde alla fine.
L'altro punto che farei è il []
non sono necessari. \d
Mantiene il suo significato al di fuori delle gamme di personaggi.
Quindi il tuo regex dovrebbe apparire così: /^\d{4}-\d{2}-\d{2}$/
.
Altri suggerimenti
Come ti aspetti che la tua data sia terminata?
Se una fine della linea, allora un seguito $
dovrebbe fare il trucco.
Se da un carattere non di non cifre, allora un seguente negativo asserzione (?!\d)
Allo stesso modo funzionerà.
^20[0-2][0-9]-((0[1-9])|(1[0-2]))-([0-2][1-9]|3[0-1])$
Ho aggiunto un piccolo assegno extra per aiutare con il problema di MM
e DD
Si confonde dall'utente. Questo non cattura tutti i mixup degli appuntamenti, ma mantiene il YYYY
parte tra 2000
e 2029
, il MM
fra 01
e 12
e il DD
fra 01
e 31
Probabilmente vuoi mettere ancore sull'espressione. cioè
^[\d]{4}-[\d]{2}-[\d]{2}$
Nota il cartello e il cartello del dollaro.
[\d]{4}-[\d]{2}-[\d]{2}?
Dove il punto interrogativo significa "non-grigio"
Probabilmente vuoi guardare avanti le affermazioni (supponendo che il tuo motore le supporti, Php/Preg/PCRE lo fa)
Guarda le affermazioni (o asserzioni positive) ti permettono di dire "e dovrebbe essere seguito da x, ma x non dovrebbe far parte della partita). Prova la seguente sintassi
\d{4}-\d{2}-\d{2}(?=[^0-9])
L'affermazione è questa parte
(?=[^0-9])
Sta dicendo "Dopo il mio regex, il prossimo personaggio non può essere un numero"
Se questo non ti dà ciò che desideri/di cui hai bisogno, pubblica un esempio del tuo input e del tuo codice PHP che non funziona. Quei due elementi può essere estremamente utile nel debug di questo tipo di problemi.
Potresti provare a mettere sia un simbolo '^' che un '$' all'inizio e alla fine della tua espressione:
/^[\d]{4}-[\d]{2}-[\d]{2}$/
che corrispondono rispettivamente all'inizio e alla fine della stringa.