PHP preg_match mysql time datatype в формате xxx: xx: xx - PullRequest
1 голос
/ 24 марта 2012

Поиск правильного preg_match (или другого решения) для проверки строки, которая будет идти в mysql time datatype. Формат: ххх: хх: хх и между диапазонами от -838: 59: 59 до 838: 59: 59

Также имейте в виду, что "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)

Но это только правильно проверяет минуты и секунды. Есть идеи!?

Также обратите внимание, что я понимаю, что тип данных mysql time также принимает значения без двоеточий, но это уже обрабатывается отдельно;)

EDIT

Мне очень жаль, ребята, неправильно понял mysql doc. 70:59 действительно допустимый ввод, он будет переведен в 70: 59: 00

Ответы [ 2 ]

2 голосов
/ 24 марта 2012
/^-?([0-7]?[0-9]{1,2}|8([0-2][0-9]|3[0-8]))(:[0-5][0-9]){1,2}$/D
1 голос
/ 24 марта 2012
(?<![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

Это фактически соответствует временным строкам в большом тексте, а не просто проверяет их.

...