PHP preg_match с рабочим регулярным выражением

function validateDate( $date ) { echo $date; //2012-08-24 20:30:00 if(preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/', $date) >= 1) { return true; } else { return false; } } 

Это всегда возвращает false. Я использовал единственный инструмент для создания регулярного выражения, и он отлично работал там. Проблема возникла, когда я добавил «/» в регулярное выражение. Как-то PHP, похоже, требует их, но я не знаю, почему, и я не знаю, почему это ломает мое регулярное выражение.

Он должен возвращать TRUE для sth. например «2012-08-24 20:30:00» и FALSE для «asdf2012-08-24 20: 30: 00asdf» или что-то, что не соответствует моему регулярному выражению

Заранее спасибо!

———————– EDIT Спасибо за все ваши ответы!

Как отметили некоторые пользователи, моя функция возвращает true для образца даты «2012-08-24 20:30:00». Однако он делает это, только если я вручную установил $ date = '2012-08-24 20:30:00. Если я вызываю функцию в другом месте моего кода с той же строкой, она возвращает false. Кто-нибудь знает, почему?

———————– EDIT2

Да, извините за то, что тратил свое время, это было фактически пустое, которое было добавлено в строку. используя trim () на моей дате перед вызовом моей функции, теперь дает правильный результат.

всем спасибо!

Related of "PHP preg_match с рабочим регулярным выражением"

Зачем использовать регулярное выражение? Используйте класс DateTime .

 function validateDate($date, $format = 'Ymd H:i:s') { $d = DateTime::createFromFormat($format, $date); return $d && $d->format($format) == $date; } 

Вы можете использовать эту функцию для всех видов проверки даты и времени. Примеры:

 var_dump(validateDate('2012-02-28 12:12:12')); # true var_dump(validateDate('2012-02-30 12:12:12')); # false var_dump(validateDate('2012-02-28', 'Ym-d')); # true var_dump(validateDate('28/02/2012', 'd/m/Y')); # true var_dump(validateDate('30/02/2012', 'd/m/Y')); # false var_dump(validateDate('14:50', 'H:i')); # true var_dump(validateDate('14:77', 'H:i')); # false var_dump(validateDate(14, 'H')); # true var_dump(validateDate('14', 'H')); # true var_dump(validateDate('2012-02-28T12:12:12+02:00', 'Ymd\TH:i:sP')); # true # or var_dump(validateDate('2012-02-28T12:12:12+02:00', DateTime::ATOM)); # true var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', 'D, d MYH:i:s O')); # true # or var_dump(validateDate('Tue, 28 Feb 2012 12:12:12 +0200', DateTime::RSS)); # true var_dump(validateDate('Tue, 27 Feb 2012 12:12:12 +0200', DateTime::RSS)); # false # ... 

Возвращает true для меня. Попробуйте это регулярное выражение:

 function validateDate($date) { echo $date; if( !preg_match("/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/",$date,$m)) return false; if( !checkdate($m[1],$m[2],$m[0])) return false; if( $m[3] > 23) return false; if( $m[4] > 59) return false; if( $m[5] > 59) return false; return true; } 

Легче проверять формат в RegEx, а затем проверять контент с помощью целевых функций, чем пытаться делать все в RegEx.

Это должно работать лучше и быть более простым:

 function validateDate($date) { return preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([1-2]{1})([0-9]{1}):([0-5]{1})([0-9]{1}):([0-5]{1})([0-9]{1})$/', $date); } 

Однако он вернется с 9999-99-99 29:59:59 как говорили другие …

Из руководства PHP вы можете легко найти более элегантные и надежные решения, например (вдохновленные этим комментарием ):

 function validateDate($data) { return (date('Ymd H:i:s', strtotime($data)) == $data); } 

То, о чем вы спрашиваете, – это разделители. Прочтите эту статью в руководстве PHP.net: RegExp – разделители

При использовании функций PCRE требуется, чтобы шаблон был заключен в разделители . Разделителем может быть любой символ, не являющийся буквенно-цифровым, без обратного слэш-символа.

А также:

Часто используемыми разделителями являются косые черты (/), хэш-знаки (#) и тильды (~). Ниже приведены все примеры действительных шаблонов с разделителями.