我有一个正则表达式验证我的日期格式
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";
}
?>
任何帮助将不胜感激 提前致谢
答案 0 :(得分:1)
试试这个:
/([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类及其验证功能。它会更好,因为它会接受你没想到的格式。