我有一个用户表单,我让用户输入日期。我有一个函数将用户的输入转换为时间戳。但它能处理的唯一格式是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);
但我得到的只是一个错误
(未知修饰语“}”),
有谁知道什么是错的?这是我第一次尝试使用正则表达式。
答案 0 :(得分:2)
您收到错误是因为您没有使用正则表达式分隔符。
应该是:
preg_match_all("#[0-9]{0,2}/[0-9]{0,2}/[0-9]{4}#", $string,$matches);
这当然不能解决您的原始问题,只是告诉您需要在您选择的分隔符中使用正则表达式,例如/
,#
,~
,{{1等等。
提示:要以各种格式解析日期,请查看 strototime PHP function 。
答案 1 :(得分: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}/
的两次出现合并到(\d{0,2}/){2}
中。但有些人可能会发现这更难阅读。
答案 2 :(得分:1)
我不认为正则表达式是你想要的方式。尝试使用PHP的DateTime对象:
$objDate = new DateTime($strDate);
$strNewDate = $objDate->format('m/d/Y');
答案 3 :(得分:1)
你需要做两件事:
此表达式需要格式化为: DELIMITER 正则表达式 DELIMITER 参数
例如, / 正则表达式 / params
所以这将是使用正斜杠作为分隔符的正则表达式:
preg_match_all("/[0-9]{0,2}\/[0-9]{0,2}\/[0-9]{4}/", $string, $matches);