Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проверка корректности даты
 
 автор: Sfinks   (15.09.2012 в 10:46)   письмо автору
 
 

Написал вчера выражение для проверки корректности введенной даты в формате MySQL TIMESTAMP, т.е. YYYY-MM-DD (время не проверяется) в диапазоне с 1970-01-01 до 2037-12-31 (конец диапазона немного сократил), с учетом количества дней в месяце и високосных годов.

Может кому пригодится!
<?php
  $pattern
='#^((19[7-9]\d|20[0-2]\d|203[0-7])-((0[469]|11)-(0[1-9]|[12]\d|30)|(0[13578]|1[02])-(0[1-9]|[12]\d|3[01]))|(19(8[048]|[79][26])|20([02][048]|[13][26]))-02-(0[1-9]|1\d|2[0-9])|(19([79][01345789]|8[1235679])|20([02][1235679]|1[01345789]|3[013457]))-02-(0[1-9]|1\d|2[0-8]))$#';
?>

P.S. Может кто потестит, найдет ошибки?

  Ответить  
 
 автор: confirm   (15.09.2012 в 10:58)   письмо автору
 
   для: Sfinks   (15.09.2012 в 10:46)
 

Введенное в отдельное поле, то есть подразумевается в нем только дата?

  Ответить  
 
 автор: Sfinks   (15.09.2012 в 11:23)   письмо автору
 
   для: confirm   (15.09.2012 в 10:58)
 

Да, только дата. Вернее в поле может быть и не только дата, и в другом формате, но РВ проверяет только дату и перед использованием нужно привести к формату YYYY-MM-DD.
Дописать время вроде просто, сложнее с количеством дней в месяце, поэтому я не стал.
Если кому надо будет, допишут сами. Мне не надо было.

  Ответить  
 
 автор: confirm   (15.09.2012 в 11:31)   письмо автору
 
   для: Sfinks   (15.09.2012 в 11:23)
 

Ну если ожидается только дата, то зачем парсить?
<?
$str 
'12-6/12';
echo 
strtotime($str)===false "Строка ($str) недопустима" 
                             
"$str == " date('Y-m-d h:i:s'
                                            
strtotime($str));

PS. Я ведь могу ввести и так дату - 15.9.2012, и это не ошибка.

  Ответить  
 
 автор: Sfinks   (15.09.2012 в 12:07)   письмо автору
 
   для: confirm   (15.09.2012 в 11:31)
 

А в JS?

Кроме того, я не доверяю функции strtotime(), т.к. совсем не уверен, во что она превратит дату, например '01.02.03'.

А если проверять с помощью mktime(), то '32.05.2000' она приведет к '01.06.2000', а должна быть ошибка.

Короче как по мне, то через РВ надежнее всего.

> Я ведь могу ввести и так дату - 15.9.2012
Если есть интерфейс, в котором необходимо ввести дату в строго определенном формате, то не можете!
Например дата выдачи паспорта. Написана она в паспорте '03.10.2003', так и вводите.

  Ответить  
 
 автор: confirm   (15.09.2012 в 12:21)   письмо автору
 
   для: Sfinks   (15.09.2012 в 12:07)
 

Это ваше право не доверять, а лучше проверить - строка 01.02.03 вернет текущую дату с временем 2012-09-15 01:02:03.

Что касается JS, то такую кухню на клиенте я вообще бы не городил, ни к чему. Проверки нужно делать на сервере, а на клиенте определяться с допустимым форматом.

А что касается Если есть интерфейс, в котором необходимо ввести дату в строго определенном формате, то не можете!, то зачем вообще вся эта арифметика, не проще ли проверить формат ввода и все?

Написано много, в смысле РГ, но все бес толку, так как не понятно, вроде бы хотим всего, в тоже время не все учитывается, вроде бы хотим только определенного, в тоже время столько условий...

>Короче как по мне, то через РВ надежнее всего.

Это не надежнее, это просто не оправдано.

  Ответить  
 
 автор: Sfinks   (15.09.2012 в 12:42)   письмо автору
 
   для: confirm   (15.09.2012 в 12:21)
 

Любите же вы поубеждать других в чем-либо!
Не хотите, не пользуйтесь. Я выложил для тех, кому надо!

> строка 01.02.03 вернет текущую дату с временем 2012-09-15 01:02:03
А я имел ввиду 1 февряля 2003 года.

> а на клиенте определяться с допустимым форматом.
И зачем мне перегружать и перезаполнять здоровенную форму, если добросовестный клиент опечатался и ввел вместо 2003 года 0203? Или число поставил 42 вместо 24го ?

> не проще ли проверить формат ввода и все?
Под формат DD.MM.YYYY подходит и 88.88.8888
Тогда можно и формат не проверять, если все-равно можно вписать чушь!

> вроде бы хотим всего, в тоже время не все учитывается, вроде бы хотим только определенного, в тоже время столько условий
Условий всего два! Дата должна быть допустимой и проверяться на клиенте (например, но моя ситуация описана ниже).

> это просто не оправдано
Я бы не зарекался. Ситуации бывают разные!
Мне например надо проверить в цикле 180 полей разных форматов. И я не хочу еще разбирать какой тип данных в каждом конкретном поле. Я просто унифицировал имена полей и написал ассоциативный массив РВ, из которого берется шаблон по первым трем буквам имени аргумента массива $_POST.

  Ответить  
 
 автор: confirm   (15.09.2012 в 12:54)   письмо автору
 
   для: Sfinks   (15.09.2012 в 12:42)
 

Я не убеждаю, я просто не понимаю этого )
Ну, надо либо определиться с выбором условий, либо...

>Под формат DD.MM.YYYY подходит и 88.88.8888
>Тогда можно и формат не проверять, если все-равно можно вписать чушь!


strtotime() эту чушь не пропустит. Данная функция не просто возвращает метку времени, но и учитывает локаль, так почему этим не пользоваться? Или лучше писать длииииинную портянку с учетом всего? ) В то же время, если у вас такое длинное выражение, то есть ожидающее варианты, ну почему тогда нельзя в русском формате дату указать, или я ленивый и напишу "now", и вернет текущую/дату время. Где тут ошибка? Нет ее. Но коли говорить о допустимом формате, то это гораздо проще, если речь о РВ, так как если соответствует формату, то останется только получить дату/время, и опять таки с помощью strtotime(). А ваши действия предполагают кроме этого еще и в правильный формат преобразовать, как вы пишите, и где же выгода?

>Мне например надо проверить в цикле 180 полей разных форматов.

Тем более не стоит смотреть в сторону РВ. Загляните в руководство, ведь работа с данными типа дата/время, это не одна две функции, а гораздо шире, тем более что в последней версии добавлено еще.

PS. Мне да, мне не надо, я таким не стану методом... Ну разве я сказал, что против того, чтобы вы это здесь выставляли? Да пусть пользуются, если надо. )

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования