我正在尝试使用preg_match()使用PHP验证DD / MM / YYYY等日期。这就是我的REGEX表达式:
$pattern = "/^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$/";
但是使用正确值,我收到此消息:
preg_match():未知修饰符'('
完整代码:
$pattern = "/^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$/";
$date = "01/03/2011";
if(preg_match($pattern, $date)) return TRUE;
提前谢谢
答案 0 :(得分:12)
将表达式中的/
个字符转义为\/
。
$pattern = "/^([123]0|[012][1-9]|31)\/(0[1-9]|1[012])\/(19[0-9]{2}|2[0-9]{3})$/";
正如其他答案所指出的那样,使用表达式中未使用的另一个分隔符(例如~
)可以更好地避免“倾斜牙签”效应,从而使其难以阅读。
答案 1 :(得分:2)
你的分隔符是/,但你在模式本身内部使用它。 使用不同的分隔符,或转义/
答案 2 :(得分:2)
您使用/
作为分隔符,也使用表达式。现在
/^([123]0|[012][1-9]|31)/
“完整”表达式和所有后续内容是否需要作为修饰符,也是(
。
您可以简单地使用其他分隔符。
~^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$~
或者你逃避表达式中/
的所有出现,但我更喜欢另一个分隔符;)它更具可读性。
答案 3 :(得分:1)
你可以按照建议逃避斜杠/
。不过,它最终会导致Leaning Toothpick Syndome。
通常使用不同的分隔符来保持正则表达式的清洁:
// Using "=" as delimiter
preg_match('=^ ... / ... $=', $input);
答案 4 :(得分:0)
使用以下功能的checek日期
function checkDateFormat($date)
{
//match the format of the date
if (preg_match ("/^([0-9]{2}) \/([0-9]{2})\/([0-9]{4})$/", $date, $parts))
{
//check weather the date is valid of not
if(checkdate($parts[2],$parts[1],$parts[3]))
return true;
else
return false;
}
else
return false;
}
echo checkDateFormat("29/02/2008"); //return true
echo checkDateFormat("29/02/2007"); //return false