日期正则表达式php

时间:2014-06-06 04:35:35

标签: php regex

我有一个正则表达式验证我的日期格式

2013年8月4日至14日和13日

但我想要一个正则表达式,它也将验证我的低于日期格式 2013年12月14日星期六,下午1:22:06和 14Dec2013

我已经实现了以下代码

 <?php

     $toMatch = '14Dec2013';

     if(preg_match_all('/\d{1,2}\W[a-z,]{3,7}\W\d{2,4}/i', $toMatch, $regs))
     {
           echo "true";
     }
     else
     {     
           echo "false";     
     }

 ?>

任何帮助将不胜感激 提前致谢

3 个答案:

答案 0 :(得分:1)

Live demo

试试这个:

/([a-zA-Z]+, \d{1,2} [a-zA-Z]+, \d{4} \d{1,2}:\d{1,2}:\d{1,2} (PM|AM))|(\d{1,2}[ -]?[a-zA-Z]+[ -]?\d{1,4})/

答案 1 :(得分:0)

我认为在这种情况下,尝试解析它会更好。如果它成功了,那么它是有效的,否则它不是。通过这种方式,它可以捕获所有边缘情况。

<?php

function validate($toMatch)
{
    $d = Datetime::createFromFormat('jMY', $toMatch);
    if ($d) return true;

    $d = Datetime::createFromFormat('l, j F, Y h:i:s A', $toMatch);
    if ($d) return true;

    return false;
}

var_dump(validate('14Dec2013'));
# bool(true)

var_dump(validate('Saturday, 14 December, 2013 1:22:06 PM'));
# bool(true)

var_dump(validate('13 oct 2013'));
# bool(false)

答案 2 :(得分:0)

您应该在正则表达式中使用替代和子模式。它们由|分隔并附在()中。但是让我们先看看你当前的RegExp:

\d{1,2} means one or two digits
\W means non-word character (hence - or space is accepted)
[a-z,]{3,7} means lowecase letters from a to z plus comma must be here 3 to 7 times
\W means non-word character again
\d{2,4} means 2 to 4 digits

这个正则表达式已经很糟糕,因为它会接受类似&#34; 33 * ,,, * 999&#34; - 不是一个正确的约会,不是吗? :)

现在回到原来的问题。让我们首先为14Dec2013定义regexp:

([012]\d|3[01])(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{4}

这可能与regexp一样好:它将匹配所有好日期并排除大多数不良日期。但它会接受30feb0001。

现在是2013年12月14日星期六下午1:22:06的第二种格式。我将使regexp变得懒惰并且不会检查工作日名称和月份名称 - 只需将它们称为单词字符行。

\w+,\s*\d{1,2}\s+\w+,\s*\d{4}\s+\d{1,2}:\d{2}:\d{2}\s*(am|pm)

表示

\w+ at least one or more alphabetic characters (matching week day name)
, comma
\s* space(s) or nothing
\d{1,2} one or two digits
\s+ at least one space
\w+ at least one or more alphabetic characters (matching month name)
, comma
\s* space(s) or nothing
\d{4} four digits in a row
\s+ at least one space
\d{1,2} one or two digits
: colon
\d{2} two digits
: colon
\d{2} two digits
\s* space(s) or nothing
(am|pm) either "am" or "pm" (don't forget to have "i" modifier to make regexp case insensitive)

拥有这两种额外的格式,您现在可以使用(|)构造将它与原始正则表达式放在一起:

^(\ d {1,2} \ W [AZ,] {3,7} \ W \ d {2,4} |([012] \ d | 3 [01])(一月| 2月|擦伤|四月|可能会|君|七月|八月|九月|辛| 11月|分解)\ d {4} | \ W +,\ S * \ d {1,2} \ S + \ W +,\ S * \ d { 4} \ S + \ d {1,2}:\ d {2}:\ d {2} \ S *(AM | PM))$

将它贴在你的脚本中//你会得到什么&#34; work&#34;为了你。为什么用引号?因为使用正则表达式来验证这样复杂的数据是个坏主意(你可以获得无效日期的数量),因此你应该使用Datetime类及其验证功能。它会更好,因为它会接受你没想到的格式。