日期验证未知修饰符错误

时间:2011-02-02 20:35:48

标签: php regex preg-match

我正在使用此字符串以dd / mm / yyyy'和'dd-mm-yyyy格式验证日期字段:

'/^(0?[1-9]|[12][0-9]|3[01])[\/\.- ](0?[1-9]|1[0-2])[\/\.- ](19|20)\d{2}$/'

但我收到此错误

警告:preg_match()[function.preg-match]:102行/var/www/...fields_lib.php中的未知修饰符'\'

请记住,上面的字符串是在没有任何分隔符的Web应用程序可选验证表单字段中输入的,因为我认为表单嵌入了分隔符本身。 对于其他验证类型,如整数和十进制数,我必须删除验证的分隔符才能处理此特定表单。

有什么想法吗?

谢谢

2 个答案:

答案 0 :(得分:2)

您不需要字符类中的反斜杠,因此您的正则表达式应该(部分)[/. -]读取。另请注意,空格和短划线已切换空格,因为[.- ]将被解释为“.之间的任何字符。

答案 1 :(得分:1)

我没有得到那个错误;因为@CanSpice给出了原因,我得到了“范围乱序”错误。为了得到另一个错误,我必须删除字符类中的第一个反斜杠([/\.- ]而不是[\/\.- ])。然后它将/解释为正则表达式分隔符,并且它期望下一个字符是修饰符(对于不区分大小写i,或者m )。

所以你有两个问题:-被视为范围运算符,/被视为正则表达式分隔符。您可以通过使用反斜杠转义违规字符来处理这两个问题(即[\/.\- ]),但每个问题都有一个更优雅的解决方案。如果您将-移动到无法形成范围的第一个或最后一个位置,则会将其视为文字-。至于/,你可以使用其他东西作为正则表达式分隔符。例如:

'~^(0?[1-9]|[12][0-9]|3[01])[/. -](0?[1-9]|1[0-2])[/. -](19|20)\d{2}$~'

仅供参考,.根本不需要进行转义。在角色类中,大多数正则表达式元字符都失去了它们的特殊含义。你恰好碰到了两个特殊情况。 : - /