【问题标题】:preg replace does not replace in phppreg 替换不会在 php 中替换
【发布时间】:2014-02-06 13:56:43
【问题描述】:

我有这个代码来替换这样的 php 日期中的模式

$input = preg_replace('/\/\-\.\_\s/', '-', $date);

如果我以mm/dd/yyyy 的形式传递日期,preg_replace 只会返回传递的日期

预期的输出应该是mm-dd-yyyy 有什么问题

【问题讨论】:

  • 你想做什么?您是否尝试将/. 更改为-?你期望从什么输入得到什么输出?
  • What could be wrong 我会说“使用 preg_replace 来操作日期”。有great PHP functions for manipulating dates

标签: php regex date preg-replace


【解决方案1】:

您打算用- 替换的字符集属于[] 字符类。在那里,. 不需要转义。

$out = preg_replace('#[/._\s]#', '-', $date);

当您将/ 作为预期字符之一处理时,建议使用不同的字符,例如# 作为分隔符。

$date = '01/02/2013';
echo preg_replace('#[/._\s]#', '-', $date);
// 01-02-2013

$date = '01.02.2013';
echo preg_replace('#[/._\s]#', '-', $date);
// 01-02-2013

// Or mixed...
$date = '01 02/2013';
echo preg_replace('#[/._\s]#', '-', $date);
// 01-02-2013

在您的尝试中,不使用字符类 [] 导致您的表达式预期字符 /-._\s 字面上是连续的。

【讨论】:

    【解决方案2】:

    您可能一心想使用正则表达式,在这种情况下,您可以无视我的回答。但是,如果您想改进作为程序员的工具集,那么花一些时间学习 PHP 的日期/时间函数可能对您有所帮助。以下是我将如何解决您的问题:

    将您的输入日期转换为 UNIX 时间戳。这只是日期/时间的整数表示。

    使用 PHP 的 strtotime 函数来执行此操作 (documentation here)。它将“关于任何英文文本日期时间描述转换为 Unix 时间戳。”

    $timestamp = strtotime('02/06/2014');
    

    将该时间戳格式化为您想要的格式的字符串。

    使用 PHP 的 date 函数来执行此操作 (documentation here)。这是一个非常通用且有用的功能。

    $properly_formatted_date = date('m-d-Y', $timestamp);
    

    输出新格式化的日期。

    print $properly_formatted_date;
    

    当然,此解决方案不使用正则表达式。但是,我不相信您的问题需要正则表达式。事实上,如果您的输入发生变化(可能原始日期的格式不再是mm/dd/yyyy,而是yyyy-mm-dd),您将需要更改您的正则表达式。但是strtotime 应该可以处理它,而且您的代码不需要更改。

    【讨论】:

      猜你喜欢
      • 2012-01-26
      • 2017-01-05
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2017-11-13
      相关资源
      最近更新 更多