我想使用正则表达式从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>
答案 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);
(提供相同的输出)