Php 未知修饰符';(';与正则表达式一起使用preg_match()时
我正在尝试使用preg_match()用PHP验证DD/MM/YYYY之类的日期。这是我的正则表达式的样子:Php 未知修饰符';(';与正则表达式一起使用preg_match()时,php,regex,Php,Regex,我正在尝试使用preg_match()用PHP验证DD/MM/YYYY之类的日期。这是我的正则表达式的样子: $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]{
$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;
提前谢谢将表达式中的
/
字符转义为\/
$pattern = "/^([123]0|[012][1-9]|31)\/(0[1-9]|1[012])\/(19[0-9]{2}|2[0-9]{3})$/";
正如其他答案所指出的,最好使用表达式中未使用的另一个分隔符,例如
~
,以避免“倾斜牙签”效应,使其更难阅读。您的分隔符是/,但您正在图案本身内部使用它。
使用不同的分隔符,或转义/您可以按照建议转义斜杠
/
。不过,这最终会导致错误
通常使用不同的分隔符来保持正则表达式的干净:
// Using "=" as delimiter
preg_match('=^ ... / ... $=', $input);
您可以使用
/
作为分隔符,也可以在表达式中使用。现在
/^([123]0|[012][1-9]|31)/
是“complete”表达式,以下所有内容都应作为修饰符,同时也是(
)
您可以简单地使用另一个分隔符
~^([123]0|[012][1-9]|31)/(0[1-9]|1[012])/(19[0-9]{2}|2[0-9]{3})$~
或者,您可以跳过表达式中所有出现的
/
,但我更喜欢另一个分隔符;)它更可读。使用下面的函数检查日期
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