正则表达式替换php中的日期格式

时间:2012-12-19 03:19:46

标签: php regex date

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

1 个答案:

答案 0 :(得分:1)

日期函数的文字值为'$ 1'。 preg_replace函数知道将其解释为捕获的子模式的值,但日期函数不是。

您可以使用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);

(提供相同的输出)