preg_match: проверить формат дня рождения (дд / мм / гггг) - PullRequest
10 голосов
/ 15 сентября 2010

Как мне сделать выражение, которое проверяет ввод в день рождения, чтобы соответствовать формату, подобному этому дд / мм / гггг? Ниже то, что я до сих пор вышел, но это тоже нужно, если я поставлю 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 должен быть приемлемым ... дайте мне знать, если у вас есть идея получше!

спасибо, Лау

Ответы [ 11 ]

25 голосов
/ 15 сентября 2010

Я бы предложил вместо этого использовать 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 проверяет фактическую дату.

22 голосов
/ 15 сентября 2010

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

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

list($dd,$mm,$yyyy) = explode('/',$cnt_birthday);
if (!checkdate($mm,$dd,$yyyy)) {
        $error = true;
}
3 голосов
/ 04 сентября 2013
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 голосов
/ 16 сентября 2010

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

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

2 голосов
/ 16 сентября 2010
$ok  = DateTime::createFromFormat('d/m/Y',$datestring)->format('d/m/Y') == $datestring;

PHP> = 5,3

1 голос
/ 22 ноября 2012

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

 list($month,$day,$year)=explode("/",$date);
if(checkdate($month,$day,$year))
{
echo "good";
}
else{echo "bad";}
1 голос
/ 15 сентября 2010

Чтобы быть действительно анально-сохраняемым, может быть проще использовать текущее регулярное выражение, проанализировать числа, а затем проверить, что они находятся в диапазоне с помощью checkdate () , но для ударов вот регулярное выражение, даты = 01-31 (и 1-9) и месяц = ​​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 ()
0 голосов
/ 30 марта 2017

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

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

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

Regex format здесь .. спасибо Абин.

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

+ веселит

0 голосов
/ 28 сентября 2016

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

0 голосов
/ 10 февраля 2015

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

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

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

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