0

我对 preg_match_all 和类似的经验不是很丰富,我正在寻找一种简单的方法来执行以下操作:

考虑这段文字:

$string = 'This text was written on [set_stamp]1341066037[/set_stamp] and this one on [set_stamp]1340903119[/set_stamp].';

我需要做什么:

  1. 获取所有标签之间的数据(此处为时间戳)[set_stamp][/set_stamp]
  2. 将所有捕获的时间戳替换为其相应的日期,例如:date('Y-m-d H:i:s', $timestamp)
  3. 删除所有[set_stamp][/set_stamp]标签

最终输出将类似于以下内容:

“这篇文章写于 2012 年 7 月 12 日 14:26,这篇文章写于 2012 年 7 月 11 日 17:10。”

4

1 回答 1

0

您可以使用preg_replace_callback()以下正则表达式:

#\[set_stamp\](.+)\[/set_stamp\]#iU

示例代码:

$string = 'This text was written on [set_stamp]1341066037[/set_stamp] and this one on [set_stamp]1340903119[/set_stamp].';
echo preg_replace_callback('#\[set_stamp\](.+)\[/set_stamp\]#iU', function($m) {
    return date('Y-m-d H:i', $m[1]);
}, $string);

该代码的输出是:

这篇文章写于 2012-06-30 16:20,这篇文章写于 2012-06-28 19:05。

请注意,匿名函数至少需要 PHP 5.3。如果您使用的是旧版本并且确实无法更新,只需创建一个普通函数并将其名称作为字符串传递。

于 2012-07-02T22:19:09.483 回答