不推荐单独用正则验证日期格式。正则仅能粗筛格式(如剔除2023/01/01),无法识别2023-02-30等逻辑错误;必须配合DateTime::createFromFormat()或checkdate()做语义校验,并注意时区、格式严格匹配及返回值检查。
PHP 表单中用正则验证日期格式靠谱吗?
不推荐单独用正则验证日期格式。正则能检查字符串是否「像」YYYY-MM-DD,但无法判断2023-02-30或2023-13-01这种逻辑上不存在的日期。常见错误是写一个看似严格的正则(比如/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/),结果仍放过非法组合。
真正安全的做法是:先用正则粗筛格式,再用 PHP 内置函数做语义校验。
- 正则只负责剔除明显乱输的(如
2023/01/01、2023-1-1、abcd-ef-gh) - 之后必须调用
DateTime::createFromFormat()或checkdate()确认年月日是否真实存在 - 注意时区影响:
DateTime默认使用当前时区,若表单未带时区信息,应显式设为new DateTimeZone('UTC')或new DateTimeZone('Asia/Shanghai')
用 DateTime::createFromFormat() 验证 Y-m-d 最稳妥
这是 PHP 5.3+ 推荐方式,能精确控制格式、容忍空格、返回明确失败信号。
关键点:
立即学习“PHP免费学习笔记(深入)”;