2

如何用 preg_replace 替换格式为“Fri Mar 23 15:21:08 2012”的日期/时间?这种格式的日期在我的文本中出现了几次,我需要用当前时间/日期替换它。

谢谢,

克里斯

4

3 回答 3

6

好吧,您需要的是一个匹配 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
);

看到它工作

于 2012-04-05T14:43:43.227 回答
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}

把所有东西放在一起:

(?: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
);

请参阅一个工作示例

于 2012-04-05T14:53:16.403 回答
0
preg_replace('/Fri Mar 23 15:21:08 2012/',date('D M d H:i:s Y'),$string);

通常做你想做的事。

于 2012-04-05T14:44:42.930 回答