php正则表达式修改字符串

时间:2013-05-20 16:52:22

标签: php regex

我有一个用户表单,我让用户输入日期。我有一个函数将用户的输入转换为时间戳。但它能处理的唯一格式是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 个答案:

答案 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)

你需要做两件事:

  1. 此表达式需要格式化为: DELIMITER 正则表达式 DELIMITER 参数

    例如, / 正则表达式 / params

  2. 必要时转义分隔符字符
  3. 所以这将是使用正斜杠作为分隔符的正则表达式:

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