我正在尝试使用preg_match: check birthday format (dd/mm/yyyy)中修改后的preg格式来匹配信用卡到期日期(yyyy-MM格式)
if (!preg_match('/([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) {
throw new Services_Payment_Exception('Card expiration date is invalid');
}
出于某种原因,它还会验证无效值,例如20111-02(无效年份)。 我在这做错了什么?我想确认年份是4位数,月份是2位数(01,02 ... 12)
答案 0 :(得分:9)
锚定你的正则表达式:
preg_match('/^([0-9]{4})-([0-9]{2})$/', $expirationDate, $matches)
你的正则表达式没有达到预期的效果,因为它匹配“20111-02”的“0111-02”子字符串。
Anchors ^
和$
匹配输入字符串中的特定位置:^
匹配字符串的开头,$
匹配结尾。
另请注意,无需转义连字符,因为它在[]
中只有一个特殊功能。
答案 1 :(得分:4)
使用^
和$
锚:
if (!preg_match('/^([0-9]{4})\-([0-9]{2})$/', $expirationDate, $matches)) {
throw new Services_Payment_Exception('Card expiration date is invalid');
}
确保整个字符串与模式匹配。
在您的示例中,20111-02匹配,因为它与0111-02
的{{1}}部分匹配。
答案 2 :(得分:2)
匹配0111-02
,符合您的要求。
变化:
'/([0-9]{4})\-([0-9]{2})/'
为:
'/^([0-9]{4})\-([0-9]{2})$/'
所以它只检查整个字符串。
答案 3 :(得分:2)
试试这个:
if (!preg_match('/^([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) {
答案 4 :(得分:2)
尝试此操作将有助于检查日期格式并检查日期是否有效:
if (!preg_match('/^([0-9]{4})\-([0-9]{2})$/', $expirationDate, $matches)) {
throw new Services_Payment_Exception('Card expiration date is wrong format');
}else if ( !strtotime($expirationDate) ){
throw new Services_Payment_Exception('Card expiration date is invalid');
}