2009-07-27 7 views

risposta

17

Questo dovrebbe funzionare:

([1-9]|1[012]):[0-5][0-9] 
+0

Questo corrisponderà a 0:59. – Brian

+0

L'ho corretto. – Brian

+1

Si noti che questo corrisponde a "3:00" in "13:00". – Cide

1

Ti piace questa: ((?:1[0-2]|0\d)\:(?:[0-5]\d)) se si desidera 0 iniziale per l'ora, se non ((?:1[0-2]|\d)\:(?:[0-5]\d)) e ((?:1[0-2]|0?\d)\:(?:[0-5]\d)) fare se non vi interessa.

+0

Ciò imporrebbe uno zero iniziale no? per esempio. Corrisponderebbe a 05:02 ma non a 5:02? – Joe

+0

risolto che: vuoi, non lo fai o non ti interessa :) –

16

Questo è un esempio di un problema in cui "hey lo so, userò le espressioni regolari!" è la soluzione sbagliata. È possibile utilizzare un'espressione regolare per verificare che il formato di input sia costituito da cifre-cifre-cifre-cifre-cifre, quindi utilizzare la logica di programmazione per garantire che i valori rientrino nell'intervallo previsto. Per esempio:

/(\d\d?):(\d\d)/ 

if ($1 >= 1 && $1 <= 12 && $2 < 60) { 
    // result is valid 12-hour time 
} 

Questo è molto più facile da leggere e comprendere che alcuni degli esempi regex offuscati che si vedono in altre risposte qui.

+1

Oppure è un esempio in cui stai compilando qualcosa che richiede espressioni regolari ... – Rodger

0

Credo che quanto sopra non riesca almeno in un modo, in particolare per quanto riguarda le stringhe come "13:00" (le corrispondenze di Keith "3:00" in quel caso).

Questo dovrebbe gestire il problema così come gli altri allevati.

([01][0-2]|(?<!1)[0-9]):([0-5][0-9]) 
0
(0?\d|1[0-2]):([0-5]\d) 

che abbinerà tutto, dalle 00:00 fino a 12:59. A proposito, sono 13 ore. Se non si desidera far corrispondere 0:00-00:59, provate questo invece:

([1-9]|1[0-2]):([0-5]\d) 
0

è possibile utilizzare questo uno:

/((?:1[0-2])|(?:0?[0-9])):([0-5][0-9]) ?([ap]m)/ 

/1 => hour 
/2 => minute 
/3 => am/pm 
0

le seguenti partite imbottite e non imbottiti ore un orologio di 24 ore (ovvero dalle 00:00 alle 23:59) tra le 00:00 e le 12:59.

(?:(?<!\d)[0-9]|0[0-9]|1[0-2]):[0-5][0-9] 

Partite:

  • 00:00
  • 00:58
  • 01:34
  • 1:34
  • 8:35
  • 12:23
  • 12:59

Nonmatches:

  • 13:00
  • 13:23
  • 14:45
  • 23:59
1

perché regex?si può fare controllare questo semplice numero intero sarà

$str = "12:74"; 
list($h , $m) = explode(":",$str); 
if (($h <=12 && $h >=0 ) && ($m <=59 && $m >=0)) { 
    print "Time Ok."; 
}else{ 
    print "Time not ok"; 
} 
+0

Sì, ma se '$ str' è uguale a '" foozah "', interromperà il tuo script (dato che non esiste un indice 1). Inoltre, se '$ str' è uguale a' "foo: zah" ', lo script dirà che * è * un tempo valido, ma mi piace pensare che non sia così. –

6
^(00|0[0-9]|1[012]):[0-5][0-9] ?((a|p)m|(A|P)M)$ 

^ - l'inizio della stringa.

(00|0[0-9]|1[012]) - qualsiasi numero a due cifre fino a 12. Richiede due cifre.

: - Partita di due punti

[0-5][0-9] - Partita di qualsiasi numero a due cifre da 00 a 59.

? - Partita di uno spazio zero o una volta.

((a|p)m|(A|P)M) - Match am o pm, senza distinzione tra maiuscole e minuscole.

$ - Abbina la fine della stringa.

0

Ecco uno schema di 12 ore con convalida AM e PM.

TIME12HOURSAMPM_PATTERN = "^(?:(?<!\\d)[0-9]|0[0-9]|1[0-2]):[0-5][0-9] ?((a|p)m|(A|P)M)$";