正则表达式并为时间创建子字符串

时间:2012-02-07 16:18:08

标签: php regex validation time

我需要定时格式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函数来完成它。

3 个答案:

答案 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;