0

我有一个用户表单,让用户输入日期。我有一个将用户输入转换为时间戳的函数。但它可以处理的唯一格式是mm/dd/yyyy. 那么,我该如何转换其中的任何一个:

m/dd/yyyy, 
m/d/yyyy, 
mm/d/yyyy 
with any separator might that be 
(/,\,-,space)

进入我的函数接受的掩码,即 mm/dd/yyyy?

首先,我尝试查看字符串是否符合我的描述:

preg_match_all("[0-9]{0,2}/[0-9]{0,2}/[0-9]{4}", $string,$matches);

但我得到的只是一个错误

(未知修饰符“}”),

有谁知道怎么了?这是我第一次尝试使用正则表达式。

4

4 回答 4

2

您收到错误是因为您没有使用正则表达式分隔符。

它应该是:

preg_match_all("#[0-9]{0,2}/[0-9]{0,2}/[0-9]{4}#", $string,$matches);

这当然不能解决您最初的问题,而只是告诉您需要在您选择的分隔符中使用正则表达式,例如, /,#等。~|

提示:要解析各种格式的日期,请查看strototime PHP 函数

于 2013-05-20T16:56:41.193 回答
2

没有必要为此使用正则表达式(实际上这需要更多的工作)。改用 PHP 的内置日期/时间函数:

strtotime: 将字符串日期(几乎任何格式)转换为 Unix 时间戳

date: 将时间戳格式化为人类可读的日期

$user_date;             #the user-supplied date, any format
$format = 'm/d/Y';      #your desired date format, in this case MM/DD/YYYY

#convert the date to your format
$formatted_date = date($format, strtotime($user_date));

或者,您可以使用DateTime对象执行此操作。鉴于$user_date上述$format情况:

$user_date_obj = new DateTime($user_date);
$formatted_date = $user_date_obj->format($format);

或者

$formatted_date = date_format(date_create($user_date), $format);

..

综上所述,要回答您的问题,只需划定您的正则表达式。斜杠会起作用,但由于您在正则表达式中匹配文字斜杠,因此使用其他东西更容易,比如条/管道:

preg_match_all("|[0-9]{0,2}/[0-9]{0,2}/[0-9]{4}|", $string, $matches);

这样,您就不需要转义斜线文字。

顺便说一句,您还可以将此正则表达式缩短为:

"|(\d{0,2}/){2}\d{4}|"

\d与 相同[0-9],您可以将两次出现的\d{0,2}/into结合起来(\d{0,2}/){2}。不过,有些人可能会觉得这更难阅读。

于 2013-05-20T16:57:10.880 回答
1

我不认为正则表达式是你想要的方式。尝试使用 PHP 的 DateTime 对象,如下所示:

$objDate = new DateTime($strDate);
$strNewDate = $objDate->format('m/d/Y');
于 2013-05-20T16:59:03.250 回答
1

你需要做两件事:

  1. 此表达式需要格式化为:DELIMITER regex DELIMITER params

    例如,/ 正则表达式 / 参数

  2. 必要时转义分隔符

所以这将是您使用正斜杠作为分隔符的正则表达式:

preg_match_all("/[0-9]{0,2}\/[0-9]{0,2}\/[0-9]{4}/", $string, $matches);
于 2013-05-20T17:03:02.797 回答