Php 预匹配日期/带或不带前导0

Php 预匹配日期/带或不带前导0,php,regex,Php,Regex,当我想转换一个日期,以便将其“馈送”到MySQL(mm/dd/yyyy->yyyy-mm-dd)时,这种预匹配可以很好地工作 $new_date = preg_replace("!([01][0-9])/([0-9]{2})/([0-9]{4})!", "$3-$1-$2", $data[$c]); 有这样的约会 04/02/2012, 12/31/2012 但当我得到像这样的输入时,它就失败了 12/1/2011, 1/4/2011 如何修复它,因为我对regex完全没有兴趣…:( 非常

当我想转换一个日期,以便将其“馈送”到MySQL(mm/dd/yyyy->yyyy-mm-dd)时,这种预匹配可以很好地工作

$new_date = preg_replace("!([01][0-9])/([0-9]{2})/([0-9]{4})!", "$3-$1-$2", $data[$c]);
有这样的约会

04/02/2012, 12/31/2012
但当我得到像这样的输入时,它就失败了

12/1/2011, 1/4/2011
如何修复它,因为我对regex完全没有兴趣…:(

非常感谢您的帮助。

试试:

!([01]?[0-9])/([0-9]{1,2})/([0-9]{4})!
$date = date("Y-m-d", strtotime($input));

第二组上的
{1,2}
表示0-9之间的1或2个数字。我还使第一部分接受1或2个数字,以便您可以匹配2012年12月3日和2012年12月3日。

只需处理日期,然后使用正则表达式就更容易了。该对象使这变得简单:

$date = new DateTime('1/1/2013');
$new_date = $date->format('Y-m-d'); // Outputs 2013-01-01
尝试:

\d
表示一个数字,我认为它比
[0-9]
更方便,它们几乎是等价的。

试试:

!([01]?[0-9])/([0-9]{1,2})/([0-9]{4})!
$date = date("Y-m-d", strtotime($input));

几乎可以使用任何格式。

它如何知道哪个是mm或dd 1st或2nd?我想他是指构造函数中的。kk谢谢……但在这种情况下,脚本中的原因已经是正则表达式,因此我可以简单地交换模式,而不必更改smth elseThanks来解释:D我认为我应该学习正则表达式,因为我认为我我以后会更经常地需要它们来验证用户输入查看www.regular-expressions.info,这是一个很好的学习网站。下面是php.net的参考资料,其中介绍了一些关于正则表达式、修饰符和模式的基础知识。