php preg_match日期格式“yyyy-MM”

时间:2012-03-28 19:08:18

标签: php regex preg-match

我正在尝试使用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)

5 个答案:

答案 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');
}