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.

È stato utile?

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.

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