【问题标题】:php preg_match a date format "yyyy-MM"php preg_match 日期格式“yyyy-MM”
【发布时间】:2012-03-28 19:08:17
【问题描述】:

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

【问题讨论】:

    标签: php regex preg-match


    【解决方案1】:

    锚定你的正则表达式:

    preg_match('/^([0-9]{4})-([0-9]{2})$/', $expirationDate, $matches)
    

    您的正则表达式没有达到您的预期,因为它匹配“20111-02”的“0111-02”子字符串。

    Anchors ^ 和 $ 匹配输入字符串中的特定位置:^ 匹配字符串的开头,$ 匹配结尾。

    还请注意,连字符无需转义,因为它仅在 [] 中具有特殊功能。

    【讨论】:

      【解决方案2】:

      使用^ 和$ 锚点:

      if (!preg_match('/^([0-9]{4})\-([0-9]{2})$/', $expirationDate, $matches)) {
          throw new Services_Payment_Exception('Card expiration date is invalid');
      }
      

      确保整个字符串与模式匹配。

      在您的示例中,20111-02 匹配,因为它匹配 20111-02 的 0111-02 部分。

      【讨论】:

        【解决方案3】:

        它与0111-02 匹配,符合您的要求。

        变化:

        '/([0-9]{4})\-([0-9]{2})/'
        

        到:

        '/^([0-9]{4})\-([0-9]{2})$/'
        

        所以它只检查整个字符串。

        【讨论】:

          【解决方案4】:

          试试这个: if (!preg_match('/^([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) {

          【讨论】:

            【解决方案5】:

            试试这个,它将帮助检查日期格式并检查日期是否有效:

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

            【讨论】:

              猜你喜欢
              • 2012-05-05
              • 2016-01-02
              • 1970-01-01
              • 2013-03-18
              • 1970-01-01
              • 2011-11-25
              • 1970-01-01
              • 1970-01-01
              • 2011-06-20
              相关资源
              最近更新 更多