【问题标题】:regular expression replace date format in php正则表达式替换php中的日期格式
【发布时间】:2012-12-19 03:19:46
【问题描述】:

我想在 PHP 中使用正则表达式替换字符串中的日期格式。

我有一个这样的字符串:

TEXT TEXT TEXT {POST_DATE,m/d/Y} TEXT TEXT TEXT

我想将所有包含 {POST_DATE,m/d/Y} 的字符串替换为从外部函数(例如 date())获取的日期,并使用输入字符串中的日期格式.

我已经尝试使用下面的代码,它只是返回了格式字符串:

$string = preg_replace('/\{POST_DATE,(.*)\}/',date('$1'),$template);

我在这里得到了返回字符串:

TEXT TEXT TEXT m/d/Y TEXT TEXT TEXT

我不确定我错在哪里以及文本中是否有许多 {POST_DATE,m/d/Y} 字符串,那么如何按照上述方式替换所有字符串。

【问题讨论】:

  • 谢谢@mario。为了更清楚,我刚刚编辑了我的问题。
  • @mario 请不要建议使用 /e 修饰符,从 PHP 5.5 开始,这是 DEPRECATED

标签: php regex date


【解决方案1】:

正在向日期函数传递一个字面值“$1”。 preg_replace 函数知道将其解释为捕获的子模式的值,但 date 函数不知道。

您可以使用 preg_replace 中的“e”修饰符将 $1 传递给您的函数:

preg_replace('/\{POST_DATE,(.*?)\}/e','date("$1")',$input);

注意,我还通过添加 ? 使 .* 不贪婪后面的字符,因为如果输入字符串中有第二个 } 字符,您将捕获比预期更多的内容。

要对此进行测试,请尝试以下操作:

$s = "TEXT TEXT TEXT {POST_DATE,m/d/y} TEXT TEXT TEXT";
print preg_replace('/\{POST_DATE,(.*?)\}/e','date("$1")',$s);

输出是:

TEXT TEXT TEXT 12/19/12 TEXT TEXT TEXT

为了避免被弃用的代码,你最好使用 preg_replace_callback,虽然它不是那么优雅:

$s = "TEXT TEXT TEXT {POST_DATE,m/d/y} TEXT TEXT TEXT";
print preg_replace_callback('/\{POST_DATE,(.*?)\}/',
                            create_function('$matches',
                                            'return date($matches[1]);'),
                            $s);

(给出相同的输出)

【讨论】:

  • 当心,PHP 5.5 正在弃用 e 修饰符以支持 preg_replace_callback。现在切换以节省以后的烦恼。
  • 您可以考虑使用closures 添加一个示例(截至 PHP >=5.3)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 2012-10-09
相关资源
最近更新 更多