如何从字符串中提取非分隔日期和时间

时间:2016-10-07 19:21:59

标签: php regex

我需要从这个字符串中提取日期和时间:some_report_20161005_1530.xml所以我可以将其重新格式化为更有效的工作。日期和时间将在不同文件之间更改,但始终采用以下格式:some_report_{year}{month}{day}_{24hr time}.xml

$test = 'some_report_20161005_1530.xml';
preg_match('(\d{4})(\d{2})(\d{2})_(\d{4})', $test, $test_matches);
print_r( $test_matches );

实现这一目标的最佳方法是什么?

(原谅我对这些功能的无知或滥用。我绝不是专家)

3 个答案:

答案 0 :(得分:3)

如果some_report不包含数字,则日期和时间部分已经在DateTime构造函数中处于良好的顺序,因此您可以使用更简单的正则表达式提取它们。

$date_time = new DateTime(preg_replace("/[^0-9]/", "", $your_string));

答案 1 :(得分:2)

一种简单的正则表达式方法是提取8位和4位数字:

preg_match("/(\d{8})_(\d{4})/", $filename, $matches);

array_shift($matches);
list($date, $time) = $matches;

工作示例:https://3v4l.org/npGC8

或者您可以使用explode并跳过正则表达式:

list($name1, $name2, $date, $time) = explode("_", str_replace(".","_", $filename));

工作示例:https://3v4l.org/lAvTN

然后就像把它交给DateTime一样简单,这样你就可以随意操作或格式化。

$dt = new DateTime($date . $time);

echo $dt->format('n/j/y h:ia'); // 10/5/16 03:30pm

答案 2 :(得分:-1)

$test = 'some_report_20161005_1530.xml';

echo  preg_replace('#(\d{4})(\d{2})(\d{2})(_)(\d{2})(\d{2})#', 
                   '${1}-${2}-${3}_${5}:${6}', $test) , '<br/>';

preg_match(
 '#(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})(_)(?<hour>\d{2})(?<minute>\d{2})#', 
 $test,$test_matches);

print_r( $test_matches );

只是例子......