我需要定时格式HH:MM am / pm。我找到了像
这样的东西$time = "HH:MM am";
preg_match('/[\s0]*(\d|1[0-2]):(\d{2})\s*([AaPp][Mm])/xms', $time, $match);
$h = $match[1];
$m = $match[2];
$a = $match[3];
时间上有很多正则表达式。但我正在寻找的是,如果有人写aa:mn jk而不是数字那么它应该给$ h = aa $ m = mn和$ a = jk或者如果有人将它们留空或部分填充如abcd那么$ h = abcd $ m = null,$ a = null。
我使用for循环解决了一些问题,但希望有些人可以帮助我使用正则表达式或使用一些PHP函数来完成它。
答案 0 :(得分:1)
你需要像~^(\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';
如果您需要任何解释,请在评论中提问
答案 1 :(得分:0)
使用Regex可能有点矫枉过正。请改用explode()
功能。
<?php
$str = 'aa:bb cc'; // or 'abcd'
$a = explode(':', $str);
$b = isset($a[1]) ? explode(' ', $a[1]) : NULL;
$h = $a[0];
$m = isset($b[0]) ? $b[0] : NULL;
$a = isset($b[1]) ? $b[1] : NULL;
var_dump($h, $m, $a);
答案 2 :(得分:0)
你对自己的要求非常含糊,所以我真的不知道你要匹配什么,但这会匹配任意数量的非:
字符,并将其粘贴在$h
中,后跟一个可选的:
和非空格字符,这些字符将放在$m
中,后跟一个可选的0或更多空格,剩下的字符将放在$a
中:
if (!preg_match('/^([^:]+)(:(\S+))?(\s*(.+))?$/i', $input, $matches)) {
// pattern did not match
}
$h = $matches[1];
$m = $matches[3] ?: NULL;
$a = $matches[5] ?: NULL;