Я хочу проверить ввод времени (например, 10:30, 02:30), используя preg_match()
Я использую это,
$pattern = "/([1-12]):([0-5])([0-9])( )(am|pm|AM|PM)/"; if(preg_match($pattern,$time)){ return true; }
Но когда я даю вход, как 10:30 pmxxxx
он не будет проверен. Я не знаю, является ли метод правильным или нет. Помоги пожалуйста.
Обозначение [...]
в регулярных выражениях определяет класс символов : то, что применяется к одиночному символу. Здесь вместо этого следует использовать альтернативу:
0[1-9]|1[0-2]
… так что регулярное выражение в целом будет выглядеть так:
/^(?:0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$/
Вы можете проверить все свои строки даты / времени с помощью DateTime :: createFromFormat :
function isTimeValid($time) { return is_object(DateTime::createFromFormat('h:i a', $time)); }
foreach (['12:30 am', '13:30 am', '00:00 pm', '00:00 am', '12:30am', '15:50pm'] as $time) { echo "Time '$time' is " . (isTimeValid($time) ? "" : "not ") . "valid.\n"; }
Time '12:30 am' is valid. Time '13:30 am' is not valid. Time '00:00 pm' is valid. Time '00:00 am' is valid. Time '12:30am' is valid. Time '15:50pm' is not valid.
[1-12]
не будет работать, потому что это не определение диапазона, но [
и ]
означает определение класса и начала символьного класса . /i
шаблона в конце, поэтому вам не нужно писать PM, pm, pM, Pm, AM, am, aM, Am
. [ap]m
. ^
и $
. \h
escape-последовательность (горизонтальный символ пробела) между временем и pm | am, поэтому время, подобное 10:10am
может быть действительным. $time = '10:30 am'; $pattern = '~^(0[0-9]|1[0-2]):([0-5][0-9])\h*([ap]m)$~i'; if (preg_match($pattern, $time, $m)) { print_r($m); return true; }
Array ( [0] => 10:30 am [1] => 10 [2] => 30 [3] => am )