我有一个字符串,我希望每个YYYY-MM-DD HH:MM:SS
日期时间字符串都替换为unix时间戳。
我已设法确定日期时间字符串的出现位置:
$my_string = 'Hello world 2014-12-25 10:00:00 and foo 2014-09-10 05:00:00, bar';
preg_match_all('((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))',$my_string,$my_matches, PREG_OFFSET_CAPTURE);
print_r($my_matches);
这将输出一个数组数组,其中包含匹配的日期时间字符串的值及其位置:
Array
(
[0] => Array
(
[0] => Array
(
[0] => 2014-12-25 10:00:00
[1] => 12
)
[1] => Array
(
[0] => 2014-09-10 05:00:00
[1] => 40
)
)
)
从这一点开始,我将循环遍历数组,并基于str_replace()
和strtotime()
进行替换,但是我认为如果我能做到这样的话,它会有更短的执行时间:
$my_string = preg_replace(
'((?:2|1)\\d{3}(?:-|\\/)(?:(?:0[1-9])|(?:1[0-2]))(?:-|\\/)(?:(?:0[1-9])|(?:[1-2][0-9])|(?:3[0-1]))(?:T|\\s)(?:(?:[0-1][0-9])|(?:2[0-3])):(?:[0-5][0-9]):(?:[0-5][0-9]))',
strtotime($VALUE_OF_MATCHED_STRING),
$my_string
);
这样,匹配的每个找到的实例都将简化为strtotime()
格式。
获得此结果的正确方法是什么?循环是最可行的方式吗?
答案 0 :(得分:0)
请改用preg_replace_callback()
。它允许您使用回调函数执行搜索和替换:
echo preg_replace_callback($pattern, function ($m) {
return strtotime($m[0]);
}, $my_string);
$m
是包含匹配项的数组。 $m[0]
包含日期字符串。
上面的代码会输出:
Hello world 1419501600 and foo 1410325200, bar