重新格式化“#h #m #s”中的时间表达式字符串到“#:#:#”

发布于 2024-12-07 02:11:09 字数 123 浏览 1 评论 0原文

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

我得到的值的格式类似于 3h 20m 31s

如何获取此输入并将其转换为 3:20:31 以便我可以在数据库中使用它?

I have 2 input boxes with times.

The values that I get back are formatted like 3h 20m 31s.

How do I take this input and turn this into 3:20:31 so I can use it in my database?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

五里雾 2024-12-14 02:11:09

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

$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))

No need to use regexes. If you have fixed format you can just do

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

Or if you are keen for regexes:

$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))
萌辣 2024-12-14 02:11:09

如果您的字符串始终有效,并且您只需要清理/重新格式化字符串,那么可以使用以下示例数据通过以下几种方法来显示前导零的保留: ($input = "3h 09m 01s";< /code>) 演示

  • 替换 hm 后跟一个带有冒号的空格,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]" : '无效';
    

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

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

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

If your strings are always valid and you just need to sanitize/reformat the string, then here are a few ways with the following sample data to show the preservation of leading zeros: ($input = "3h 09m 01s";) Demo

  • Replace h or m followed by a space with a colon and s with nothing.

    echo str_replace(['h ', 'm ', 's'], [':', ':'], $input);
    
  • Parse the string using placeholders, then join the populated array:

    echo implode(':', sscanf($input, '%dh%02sm%02ss'));
    
  • Split the string on non-digits, then join the populated array:

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

  • If you also require validation, you can use preg_match() if you want to perform conditional behavior or use preg_filter() to reduce disqualified strings to null.

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

    I'd probably opt for preg_filter() personally because falling back to null is typically a good idea when receiving malformed values destined for the database.

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

Lastly, if it is possible for valid input to not have certain components (such as no minutes expression), then some of these snippets become incompatible.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文