我需要从这个字符串中提取日期和时间: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 );
实现这一目标的最佳方法是什么?
(原谅我对这些功能的无知或滥用。我绝不是专家)
答案 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;
或者您可以使用explode
并跳过正则表达式:
list($name1, $name2, $date, $time) = explode("_", str_replace(".","_", $filename));
然后就像把它交给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 );
只是例子......