我正在使用此字符串以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应用程序可选验证表单字段中输入的,因为我认为表单嵌入了分隔符本身。 对于其他验证类型,如整数和十进制数,我必须删除验证的分隔符才能处理此特定表单。
有什么想法吗?
谢谢
答案 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}$~'
仅供参考,.
根本不需要进行转义。在角色类中,大多数正则表达式元字符都失去了它们的特殊含义。你恰好碰到了两个特殊情况。 : - /