如何用 preg_replace 替换格式为“Fri Mar 23 15:21:08 2012”的日期/时间?这种格式的日期在我的文本中出现了几次,我需要用当前时间/日期替换它。
谢谢,
克里斯
如何用 preg_replace 替换格式为“Fri Mar 23 15:21:08 2012”的日期/时间?这种格式的日期在我的文本中出现了几次,我需要用当前时间/日期替换它。
谢谢,
克里斯
好吧,您需要的是一个匹配 3 个字母 ( Fri
) 后跟一个空格和另外三个字母 ( Mar
) 的表达式。
首先我们需要匹配一些字母:
/[a-z]/
我们可以像这样精确匹配 3 个字母:
/[a-z]{3}/
...我们需要它不区分大小写:
/[a-z]{3}/i
...所以第一部分只是:
/[a-z]{3} [a-z]{3}/i
接下来,我们需要匹配 1 个或 2 个数字。数字可以用转义序列表示\d
,所以我们使用:
/\d{1,2}/
接下来我们匹配时间字符串,使用相同的转义序列:
/\d{2}:\d{2}:\d{2}/
...后面是最后一个 4 位数的年份:
/\d{4}/
把它们放在一起,我们得到:
/[a-z]{3} [a-z]{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}/i
// Fri Mar 23 15 : 21 : 08 2012
现在,我们需要将其替换为当前日期和时间。我们通常会去的地方是date()
函数,但是我们如何动态地将它放入替换中呢?好吧,我们可以将它作为字符串文字传递,或者我们可以使用回调函数从preg_replace_callback()
. 但是,preg_replace()
给了我们e
修饰符,它导致为 PHP 代码评估替换字符串。与任何 PHP 一样,我们必须小心谨慎地使用它eval()
,但这是一个合法的用例。
所以我们最终的 PHP 代码如下所示:
preg_replace(
'/[a-z]{3} [a-z]{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}/ie',
"date('D M j H:i:s Y')",
$str
);
我认为列出有限的选项集对于这些任务来说更好,它也可以让你避免误报。这些是匹配日期格式每个部分的模式:
(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)
(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
\d{1,2}
\d{1,2}:\d{2}:\d{2}
\d{4}
把所有东西放在一起:
(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2} \d{1,2}:\d{2}:\d{2} \d{4}
代码可能如下所示:
$current_date = date('D M j H:i:s Y');
$text = preg_replace(
'/(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{1,2} \d{1,2}:\d{2}:\d{2} \d{4}/i',
$current_date,
$text
);
请参阅一个工作示例。
preg_replace('/Fri Mar 23 15:21:08 2012/',date('D M d H:i:s Y'),$string);
通常做你想做的事。