将时间表达式字符串从“#h #m #s”重新格式化为“#:#:#”

问题描述 投票:0回答:2

我有2个带时间的输入框。

我返回的值的格式类似于

3h 20m 31s

如何获取此输入并将其转换为

3:20:31
,以便我可以在我的数据库中使用它?

php regex time datetime-parsing reformatting
2个回答
1
投票

无需使用正则表达式。如果你有固定的格式,你就可以这样做

$input = "3h 20m 31s";
$input = str_replace("h ",":",$input);
$input = str_replace("m ",":",$input);
$input = str_replace("s","",$input);

或者如果您热衷于正则表达式:

$input = "3h 20m 31s";
$regex = "/^\D*(\d+)\D*(\d+)\D*(\d+)\D*$/";
$matches = array();
preg_match($regex, $input,$matches);
echo implode(":",array_slice($matches,1))

0
投票

如果您的字符串始终有效,并且您只需要清理/重新格式化字符串,那么可以使用以下示例数据通过以下几种方法来显示前导零的保留:(

$input = "3h 09m 01s";
)Demo

  • h
    m
    替换为带冒号的空格,然后将
    s
    替换为空。

    echo str_replace(['h ', 'm ', 's'], [':', ':'], $input);
    
  • 使用占位符解析字符串,然后加入填充的数组:

    echo implode(':', sscanf($input, '%dh%02sm%02ss'));
    
  • 将字符串拆分为非数字,然后加入填充的数组:

    echo implode(':', preg_split('/\D+/', $input, 0, PREG_SPLIT_NO_EMPTY));
    

  • 如果您还需要验证,如果您想执行条件行为,可以使用

    preg_match()
    ,或者使用
    preg_filter()
    将不合格的字符串减少到
    null

    echo preg_match('/^(\d+)h ([0-5]\d)m ([0-5]\d)s$/', $input, $m) ? "$m[1]:$m[2]:$m[3]" : 'invalid';
    

    我个人可能会选择

    preg_filter()
    ,因为在收到发往数据库的格式错误的值时,回退到
    null
    通常是一个好主意。

    echo preg_filter('/^(\d+)h ([0-5]\d)m ([0-5]\d)s$/', '$1:$2:$3', $input);
    

最后,如果有效输入可能不具有某些组件(例如没有分钟表达式),那么其中一些片段将变得不兼容。

© www.soinside.com 2019 - 2024. All rights reserved.