Вам понадобится регулярное выражение, как это ~^(\d{1,2})((?::)(\d{1,2}))?(\s+(am|pm))?$~i
Весь тестовый код будет:
<?php
$regexp = '~^(\d{1,2})((?::)(\d{1,2}))?(\s+(am|pm))?$~i';
$tests = array(
'18',
'18:00',
'7:03 pm',
'7 pm'
);
$match = array();
foreach( $tests as $test){
preg_match( $regexp, $test, $match);
print_r( $match);
}
И результаты:
Array
(
[0] => 18
[1] => 18
)
Array
(
[0] => 18:00
[1] => 18
[2] => :00
[3] => 00
)
Array
(
[0] => 7:03 pm
[1] => 7
[2] => :03
[3] => 03
[4] => pm
[5] => pm
)
Array
(
[0] => 7 am
[1] => 7
[2] =>
[3] =>
[4] => am
[5] => am
)
Таким образом, вы можете подготовить свой окончательный результат, например:
$hours = isset( $match[1]) ? $match[1] : '00';
$minutes = isset( $match[3]) ? $match[3] : '00';
$am = isset( $match[5]) ? $match[5] : 'am';
Если вам нужно что-то объяснить, пожалуйста, спросите в комментарии