【发布时间】:2014-05-16 14:22:26
【问题描述】:
我有一个字符串,我希望将每个 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() 格式。
获得此结果的正确方法是什么?循环是最可行的方式吗?
【问题讨论】:
-
+1 表示一个清晰、易读、格式正确的问题(在php 中你不会看到很多这样的问题);)
-
谢谢@AmalMurali,我希望如果我对这个问题稍加思考,那么这将意味着更少思考有价值的答案。您的快速反应证明了这一点是正确的!也许你可以帮助解决这个问题的this extension?谢谢!
标签: php regex date replace preg-replace