3

我想使用正则表达式从 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}字符串,那么如何按照上述方式替换所有字符串。

4

1 回答 1

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);

(给出相同的输出)

于 2012-12-19T04:29:35.847 回答