使用RegEx从字符串中获取(解析)时间

时间:2015-10-20 16:27:24

标签: php arrays regex time

我需要一些关于如何改变现有RegEx线的方向。

示例字符串: 上午9:00 - 上午9:30

期望的输出: 900 930(每个都可以是数组中的索引或其他)..

目前的做法:

preg_match('/^([0-9]{1,2}):([0-9]{1,2}) ?([ap]m)/i', trim($presentationtime), $matches);

然而,这似乎只让我获得了第一次(剥离/解析)时间。

结果:

$presentationtime = $matches[1] . $matches[2];

echo 'Matches check: '. $matches[0] . '<br>';
echo 'Matches check: '. $matches[1] . '<br>';

返回:

匹配检查:9

匹配检查:00

如何改变我的正则表达式以获得两次(以相同的方式剥离/解析)..

我期待一个6索引数组..但是只能得到一个3索引/计数数组

3 个答案:

答案 0 :(得分:2)

正如@anubhava所说使用preg_match_all

$presentationtime = '9:00 AM - 9:30 AM';
preg_match_all('/([0-9]{1,2}):([0-9]{1,2}) /', trim($presentationtime), $matches);

print_r($matches);

结果:

Array
(
    [0] => Array
        (
            [0] => 9:00 
            [1] => 9:30 
        )

    [1] => Array
        (
            [0] => 9
            [1] => 9
        )

    [2] => Array
        (
            [0] => 00
            [1] => 30
        )

)

编辑以回答评论:

非常懒惰的解决方法来获得一维数组,平庸正则表达式

$presentationtime = '9:00 AM - 9:30 PM';
preg_match('/([0-9]{1,2}):([0-9]{1,2})\s([apm]+)\s-\s([0-9]{1,2}):([0-9]{1,2})\s([apm]+)/i', trim($presentationtime), $matches);

结果

Array
(
    [0] => 9:00 AM - 9:30 PM
    [1] => 9
    [2] => 00
    [3] => AM
    [4] => 9
    [5] => 30
    [6] => PM
)

答案 1 :(得分:1)

您必须简单地使用<context type="tablename, databasename"> <databaseInitializer type="databasename.Migrations.tablenameInitializer, databasename" /> </context> (如评论中的anubhava所述)并删除正则表达式开头的preg_match_all

^

然后preg_match_all('/([0-9]{1,2}):([0-9]{1,2}) ?([ap]m)/i', trim($presentationtime), $matches); 就像:

$matches

如果要优化正则表达式,可以使用:

Array
(
    [0] => Array
        (
            [0] => 9:00 AM
            [1] => 9:30 AM
        )

    [1] => Array
        (
            [0] => 9
            [1] => 9
        )

    [2] => Array
        (
            [0] => 00
            [1] => 30
        )

    [3] => Array
        (
            [0] => AM
            [1] => AM
        )

)

分钟部分将匹配从00到59的2位数字,空格部分preg_match('/([0-9]{1,2}):([0-5]\d)\s*([ap]m)/i', trim($presentationtime), $matches); 是可选的,并且匹配多个空白字符(空格,制表符,CR,FF ...)

答案 2 :(得分:0)

这样做的一种方式:

$data = '9:00 AM - 9:30 AM';
print str_replace('-', ' ', preg_replace("/[^0-9-]/","", $data));

Result:
900 930
  • 保持数字和破折号
  • 用空格替换短划线

在前面的示例中,我使用了有限的正则表达式preg_replace。为了保持简单和使用AM / PM的时间,我只是爆炸(正如你已经想到的那样),

$data = '9:00 AM - 9:30 PM';
$timeArray = array_map('trim', explode('-', $data)); // trim each array item
$timeArray = array_map('Time24Hr', $timeArray); // clean up time
print_r($timeArray);

function Time24Hr($time) {
    $time_ampm = explode(' ', $time);
    if (strtolower(trim($time_ampm[1])) === 'am') {
        // A
        return $time_ampm[0];  
        // B
        //return str_replace(':', '', $time_ampm[0]); 
        // C
        //return $time;
    }

    $hr_min = explode(':', trim($time_ampm[0]));

    // A
    return ($hr_min[0] + 12) . ':' . $hr_min[1];
    // B
    //return ($hr_min[0] + 12) . $hr_min[1];
    // C
    //return ($hr_min[0] + 12) . ':' . $hr_min[1]. ' ' . $time_ampm[1];

}

结果:

Result A:
Array
(
    [0] => 9:00
    [1] => 21:30
)

Result B:
Array
(
    [0] => 900
    [1] => 2130
)

Result C: -- obviously this is insane, but you can easily make it sane. This is just an example
Array
(
    [0] => 9:00 AM
    [1] => 21:30 PM   
)

当然,这种简单化的方法可以进一步简化。此方法不需要正则表达式。