【问题标题】:PHP: preg replace date timePHP:preg替换日期时间
【发布时间】:2012-04-05 14:34:14
【问题描述】:

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

谢谢,

克里斯

【问题讨论】:

  • 你能用str_replace('Fri Mar 23 15:21:08 2012',$newdate,$originaltext);吗?
  • 是的,我从 DaveRandom 买了一个,效果很好!

标签: php preg-replace


【解决方案1】:

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

See it working

【讨论】:

    【解决方案2】:

    我认为列出有限的选项集更适合这些任务,而且还可以避免误报。这些是匹配日期格式每个部分的模式:

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

    a working example

    【讨论】:

    • 我确实考虑过有限列表,但表达式看起来很混乱,我远离它。我认为自然语言文本块中的冲突风险非常小,格式如此复杂以至于“匹配任何 alpha”方法是可以接受的 - 但 +1 是一个好的工作解决方案。
    【解决方案3】:
    preg_replace('/Fri Mar 23 15:21:08 2012/',date('D M d H:i:s Y'),$string);
    

    通常做你想做的事。

    【讨论】:

    • 问题是如何替换指定格式中的日期,而不是确切的日期(这只是格式的一个例子)。如果要替换特定日期,简单的str_replace 就足够了。
    • Soooo,我必须得出结论,我还没有完全理解这个问题:)!
    猜你喜欢
    • 2012-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 2016-02-02
    • 2020-10-04
    相关资源
    最近更新 更多