php preg_match формат даты "гггг-мм" - PullRequest
5 голосов
/ 28 марта 2012

Я пытаюсь использовать измененный формат preg из preg_match: проверить формат дня рождения (дд / мм / гггг) , чтобы соответствовать датам истечения срока действия кредитной карты (формат гггг-ММ)

    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 ]

9 голосов
/ 28 марта 2012

Прикрепите ваше регулярное выражение:

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

Ваше регулярное выражение не сделало то, что вы ожидали, потому что оно соответствует подстроке "0111-02" в "20111-02".

Якоря ^ и $ соответствуют определенным позициям во входной строке: ^ соответствует началу строки, а $ соответствует концу.

Обратите также внимание, что нет необходимостиэкранируйте дефис, поскольку он имеет только специальную функцию в [].

4 голосов
/ 28 марта 2012

Используйте ^ и $ якоря:

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 часть 20111-02.

2 голосов
/ 28 марта 2012

Попробуйте, это поможет проверить оба формата даты и проверить, если дата действительна или нет:

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');
}
2 голосов
/ 28 марта 2012

попробуйте это: if (!preg_match('/^([0-9]{4})\-([0-9]{2})/', $expirationDate, $matches)) {

2 голосов
/ 28 марта 2012

Это соответствует 0111-02, что соответствует вашим требованиям.

Измените:

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

на:

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

, поэтому он проверяет только на совокупностьстрока.

...