【问题标题】:What is the best way to split this string value up? [closed]拆分此字符串值的最佳方法是什么? [关闭]
【发布时间】:2020-07-11 11:10:23
【问题描述】:

字符串值类似于P0DT0H4M13S

P can be ignored.
0D is the DAY
0H is the HOUR
4M is the MINUTE
13S is the SECOND

4:13 之类的事情会很好。

如果有一天,那么 1 DAY 4:13

HOUR AND DAY 可以是 1 DAY 4:4:13

我试图爆炸它,但这似乎很愚蠢,有没有可以处理这种拆分的正则表达式?

谢谢!

【问题讨论】:

  • 您在哪里遇到问题?使用正则表达式可以通过多种方式完成此操作。
  • ` \d+` 是一个合适的数字占位符,否则DateInterval::createFromDateString
  • 这与this question you asked earlier? 有什么关系吗?看到它与日期有关。您的数据来源是什么?
  • @FunkFortyNiner 没有。这是一个不同的问题。这与日期没有任何关系。
  • @soldfor 好的,谢谢,我不得不问。有时会发生与它们本身相距不远的问题具有可能提供不同方法的关系,如果它与数据库相关。假装我什么都没说lol! - P.s.:洗手,传下去! ;-))

标签: php regex datetime explode


【解决方案1】:

你可以使用正则表达式

^.(?:([1-9]*)|0)DT(\d+)H(\d+)M(\d+)S\b

它有四个捕获组,分别对应天($1)、小时、分钟和秒。如果捕获组 1 匹配(天大于零),您想要的字符串是(伪代码)

$1 DAY $2:$3:4$

如果天为零,则字符串为

$2:$3:4$

Demo

PRCE 正则表达式引擎执行以下操作:

^           # match beginning of line
.           # match 1 char 
(?:         # begin non-cap grp
  ([1-9]*)  # match '0'-'9' in capture group 1
  |         # or
  0         # match '0'
)           # end non-cap grp
DT          # match string 
(\d+)H      # match 1+ digits in cap grp 2, then 'H'
(\d+)M      # match 1+ digits in cap grp 3, then 'M'
(\d+)S      # match 1+ digits in cap grp 4, then 'S'
\b          # match word break

【讨论】:

    【解决方案2】:

    这是一个 PHP DateInterval 字符串,应该使用该类进行处理。例如:

    $str = 'P0DT0H4M13S';
    
    $interval = new DateInterval($str);
    $output = '';
    if ($interval->d) {
        $output = $interval->format('%d DAY ');
    }
    $output .= $interval->format('%H:%I:%S');
    echo $output;
    

    输出:

    00:04:13
    

    Demo on 3v4l.org

    显然,如果需要,可以修改代码以像一天一样跳过小时。

    【讨论】:

    • 谢谢尼克!!节省了我一些时间和几行代码。现在通过 Ajax 计数器运行它。再次感谢
    • @sold 不用担心 - 我很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    相关资源
    最近更新 更多