2012-03-24 12 views
1

mysql時刻のデータ型にする文字列を検証するための正しいpreg_match(または他の解決策)を探します。 フォーマットはxxx:xx:xxで、範囲 '-838:59:59'から '838:59:59'PHP preg_match mysql時刻のデータ型をxxx:xx:xx

また、「7:53:48」、「23:59」、 「145:19:59」、「-16:24:33」は全て有効入力ですが、「930:00:00」、「128:61:61」、「63:59」はすべて無効です。

私はこれまで通常時の時点でpreg_match

preg_match("/([0-9]):([0-5][0-9]):([0-5][0-9])$/", $time) 

からこれを持っている。しかし、これは唯一の適切分と秒を検証します。任意のアイデアを!?

私は本当に申し訳ありませんみんな、missunderstood mysqlのドキュメントだ

EDIT

);

は、また、私はその時のMySQLのデータ型はまた、コロンなしの値を受け入れますが、それはすでに別々に処理されています理解することに注意してください。 70:59には、実際に有効な入力である、それは70:59:00

+0

なぜ「23:59」は有効ですが、「63:59」は無効ですか?両方とも許容範囲内です。 – Tomalak

+0

@Tomalakそれは確かに私の上で恥ずかしがり屋です – eduardev

答えて

1
(?<![0-9:])-?([0-9]|[0-9][0-9]|[0-7][0-9][0-9]|8[0-2][0-9]|83[0-8]):([0-5][0-9])(?::([0-5][0-9]))?(?![0-9:]) 

説明に変換されます。

 
(?<!     # look-behind: makes sure we are at the start of a time 
    [0-9:]    # ...not preceded by a digit or a colon 
)      # end look-behind 
-?     # a minus, optional 
(     # group 1 (hours) 
    [0-9]    # single-digit 0-9 
    |     # or 
    [0-9][0-9]   # double-digit 00-99 
    |     # or 
    [1-7][0-9][0-9] # triple-digit 100-799 
    |     # or 
    8[0-2][0-9]  # triple-digit 800-829 
    |     # or 
    83[0-8]   # triple-digit 830-838 
)      # end group 1 
:      # : 
(     # group 2 (minutes) 
    [0-5][0-9]   # 00-59 
)      # end group 2 
(?:     # non-capturing group 
    :     # : 
    (     # group 3 (seconds) 
    [0-5][0-9]  #  00-59 
)     # end group 3 
)?     # end group, make optional 
(?!     # look-ahead: makes sure we are at the end of a time 
    [0-9:]    # ...not followed by a digit or a colon 
)      # end look-ahead 

これは実際にはより大きなテキストに時刻文字列にマッチするのではなく、それらを検証する。

+0

70:59が有効であり、それは – eduardev

+0

ではないはずです@エドゥアルド「70:59」はどういうわけか魔法のように '-838:59:59'から '838:59:59'の範囲にありませんか? – Tomalak

+0

簡単な仲間。ミス - ドキュメントを理解しました。確かに有効です。私は質問を編集し、あなたの答えを受け入れるでしょう。ありがとう! – eduardev

2
/^-?([0-7]?[0-9]{1,2}|8([0-2][0-9]|3[0-8]))(:[0-5][0-9]){1,2}$/D 
+0

多くの感謝を済ませました;)答えを受け入れるために5分を待つだけです – eduardev

+0

分/秒の部分も簡略化しました。 – MichaelRushton

+1

これは1桁または2桁の時間帯を受け付けませんか? – Howard

関連する問題