【问题标题】:Replace in one step based on matched result根据匹配结果一步替换
【发布时间】: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


【解决方案1】:

请改用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

Demo

【讨论】:

  • 正是我所缺少的,非常感谢您的快速回复!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2017-03-04
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2015-08-20
  • 2012-03-01
相关资源
最近更新 更多