it-roy-ru.com

preg_match: проверить формат дня рождения (дд/мм/гггг)

Как мне сделать выражение, которое проверяет ввод в день рождения, чтобы соответствовать формату, подобному этому дд/мм/гггг? Ниже то, что я до сих пор вышел, но это тоже нужно, если я поставлю 99/99/9999!

if (!preg_match("/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/", $cnt_birthday))
  {
   $error = true;
   echo '<error elementid="cnt_birthday" message="BIRTHDAY - Only this birthday format - dd/mm/yyyy - is accepted."/>';
  }

Как я могу убедиться, что он только от 01 до 31 для дд и от 01 до 12 для мм? но я уверен, как ограничить гггг ... я думаю, что теоретический 9999 должен быть приемлемым ... дайте мне знать, если у вас есть идея получше! 

спасибо, Lau 

10
laukok

На основе Тим 's checkdate решение на основе:

Извлечение дня, месяца и года можно легко выполнить с помощью explode как:

list($dd,$mm,$yyyy) = explode('/',$cnt_birthday);
if (!checkdate($mm,$dd,$yyyy)) {
        $error = true;
}
22
codaddict

Я бы предложил вместо этого использовать checkdate () :

if (preg_match("/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/", $cnt_birthday, $matches)) {
    if (!checkdate($matches[2], $matches[1], $matches[3])) {
        $error = true;
        echo '<error elementid="cnt_birthday" message="BIRTHDAY - Please enter a valid date in the format - dd/mm/yyyy"/>';
    }
} else {
    $error = true;
    echo '<error elementid="cnt_birthday" message="BIRTHDAY - Only this birthday format - dd/mm/yyyy - is accepted."/>';
}

Таким образом, регулярное выражение проверяет формат, checkdate проверяет фактическую дату.

25
Tim Fountain

Попробуйте использовать strtotime() и переформатировать его с date(). Это обеспечит большую гибкость для пользователей при вводе даты и позволит вам использовать любые форматы, которые вам нужны, в разных местах.

Лично я очень ленив, когда дело доходит до точного расчета даты и злоупотребляю ею как strtotime("-10 day",$timestamp). Преимущество этого заключается в более низкой вероятности получения иск от раздраженного родителя, потому что вы подсчитали, что возраст их маленьких дочерей чуть выше 18 лет, не учитывает правильно високосные годы, и позволили ей попасть на ваш взрослый тематический сайт, каким бы смешным это не звучало.

3
artificialidiot
if(preg_match("/(\d{2})\/(\d{2})\/(\d{4})$/", $date,$matches)){         
return (checkdate((int) $matches[2],(int)$matches[1],(int) $matches[3]) );
}else{
return false ;
}
  • preg_match для проверки шаблона дд/мм/гггг 
  • checkdate для проверки значений даты
3
Yehia
$ok  = DateTime::createFromFormat('d/m/Y',$datestring)->format('d/m/Y') == $datestring;

PHP> = 5.3

2
Wrikken

Чтобы быть действительно анально-сохраняемым, может быть проще использовать текущее регулярное выражение, проанализировать числа, а затем убедиться, что они находятся в диапазоне с помощью checkdate () , но для ударов вот регулярное выражение, обеспечивающее date = 01 -31 (и 1-9), и month = 01-12 (и 1-9).

preg_match("/([012]?[1-9]|[12]0|3[01])\/(0?[1-9]|1[012])\/([0-9]{4})/", $date_string)

Пара примечаний

  • Я использовал группировку для всех, необходимых для ORing (|) внутри, но также полезно для извлечения этих значений, если вы хотите делать с ними определенные вещи
  • 0000 не имеет особого смысла в качестве даты, но я оставил взрыв этого регулярного выражения в качестве упражнения для читателя. Если вы действительно хотите, чтобы это подтвердило дату рождения (и вы ожидаете, что в настоящее время или относительно недавно умершие люди) ограничьте это, скажем, 1900+ или 1800+, или любым другим приемлемым диапазоном для вас. Если вы можете анализировать дни рождения исторических личностей ... ваш звонок.
  • Это все еще не проверяет правильность диапазона дат для рассматриваемого месяца! так что для этого используйте checkdate ()
1
Chadwick

может быть что-то подобное поможет

 list($month,$day,$year)=explode("/",$date);
if(checkdate($month,$day,$year))
{
echo "good";
}
else{echo "bad";}
1
Sujay sreedhar

Попробуйте это регулярное выражение: ([0-9]{2}\/[0-9]{2}\/[0-9]{4})

0
dialyy

Только принятие строго отформатированной строки, вероятно, является плохой практикой. Предполагая, что вы получаете информацию с веб-страницы, было бы лучше иметь отдельные поля для месяца, дня и года. Они могут быть просто текстовыми полями, но может быть предпочтительнее иметь выпадающие меню, которые решат вашу проблему с лимитами (то есть, единственный выбор на месяц - 1,2, ..., 12). Требовать, чтобы пользователи вводили 01.01.2001, а не принимать 01.01.2001, - ленивое программирование. И только принимать "/" в качестве разделителя неудобно.

Но, чтобы коснуться исходного вопроса, даже если вы решите придерживаться форматированных строк - поскольку это поле даты рождения, вам, вероятно, следует ограничить yyyy следующим:

if($yyyy > date('Y')) {
  echo '<error elementid="cnt_birthday" message="BIRTHDAY - Year must be less than or equal to the current year."/>';
}

В противном случае люди могут иметь отрицательный возраст :)

0
catgofire

Я опоздал, чтобы увидеть это, но это решило мою проблему

    if (1 !== preg_match('/(0[1-9]|1[0-9]|2[0-9]|3(0|1))\/(0[1-9]|1[0-2])\/\d{4}/',$value)) {
        $this->form_validation->set_message('validate_emaildate','Date needs to have a valid date format - dd/mm/yyyy');
        return FALSE;
    }

Предоставлено следующие сообщения:

Формат регулярных выражений здесь .. спасибо Абин.

Функция для проверки формата [здесь] ( Соответствие регулярному выражению Codeigniter ) .. спасибо Всевышний

+ веселит

0
devak23

Возможно, не лучшее решение, но вот моя попытка.

Вы конвертируете его во время, а затем переформатируете обратно в m/d/Y. Если строка не изменилась, то она была в правильном формате для начала.

$transformedDate = date("m/d/Y", strtotime($myDate));

if($transformedDate == $myDate){        
    return true;    
} else{         
    return false;           
}
0
NL3294