Я пытаюсь проверить, указаны ли даты, введенные конечными пользователями, в формате ГГГГ-ММ-ДД. Регулярное выражение никогда не было моей сильной стороной, я продолжаю получать ложное возвращаемое значение для preg_match (), которое я настроил.
Итак, я предполагаю, что испортил регулярное выражение, подробно описанное ниже.
$date="2012-09-12";
if (preg_match("^[0-9]{4}-[0-1][0-9]-[0-3][0-9]$",$date))
{
return true;
}else{
return false;
}
Есть предположения?
php
regex
date-format
Cosmicsafari
источник
источник
date("Y-m-d", strtotime("2012-09-12"))=="2012-09-12";
или PHPcheckdate ( int $month , int $day , int $year )
.Ответы:
Попробуй это.
источник
return (bool)preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date);
Наверное, лучше использовать для этого другой механизм.
Современное решение с
DateTime
:Это тоже подтверждает ввод:
$dt !== false
гарантирует, что дата может быть проанализирована с указанным форматом, иarray_sum
уловка - это краткий способ гарантировать, что PHP не выполняет «сдвиг месяца» (например, считайте, что 32 января - 1 февраля). См.DateTime::getLastErrors()
Дополнительную информацию.Олдскульное решение с
explode
иcheckdate
:Это подтверждает, что введенная дата также является действительной. Вы, конечно, можете сделать это с помощью регулярного выражения, но это будет больше суеты - и 29 февраля вообще не может быть подтверждено с помощью регулярного выражения.
Недостатком этого подхода является то, что вы должны быть очень осторожны, чтобы отклонить все возможные «плохие» входные данные, не отправляя при этом уведомление ни при каких обстоятельствах. Вот как:
explode
ограничено возвратом 3 токенов (так что, если ввод "1-2-3-4",$d
станет "3-4")ctype_digit
используется, чтобы убедиться, что ввод не содержит нечисловых символов (кроме тире)array_pad
используется (со значением по умолчанию, которое приведетcheckdate
к сбою), чтобы убедиться, что возвращается достаточное количество элементов, чтобы при вводе «1-2»list()
не выводилось уведомлениеисточник
DateTime
и никогда не слышал оcheckdate
... позор мне.DateTime
тоже может это сделать. Я только что закончил конкретизировать ответ, взгляните еще раз, если хотите.getLastErrors
?гггг-мм-дд:
/^((((19|[2-9]\d)\d{2})\-(0[13578]|1[02])\-(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\-(0[13456789]|1[012])\-(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\-02\-(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\-02\-29))$/g
гггг / мм / дд:
/^((((19|[2-9]\d)\d{2})\/(0[13578]|1[02])\/(0[1-9]|[12]\d|3[01]))|(((19|[2-9]\d)\d{2})\/(0[13456789]|1[012])\/(0[1-9]|[12]\d|30))|(((19|[2-9]\d)\d{2})\/02\/(0[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))\/02\/29))$/g
мм-дд-гггг:
/^(((0[13578]|1[02])\-(0[1-9]|[12]\d|3[01])\-((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\-(0[1-9]|[12]\d|30)\-((19|[2-9]\d)\d{2}))|(02\-(0[1-9]|1\d|2[0-8])\-((19|[2-9]\d)\d{2}))|(02\-29\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
мм / дд / гггг:
/^(((0[13578]|1[02])\/(0[1-9]|[12]\d|3[01])\/((19|[2-9]\d)\d{2}))|((0[13456789]|1[012])\/(0[1-9]|[12]\d|30)\/((19|[2-9]\d)\d{2}))|(02\/(0[1-9]|1\d|2[0-8])\/((19|[2-9]\d)\d{2}))|(02\/29\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
дд / мм / гггг:
/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
дд-мм-гггг:
/^(((0[1-9]|[12]\d|3[01])\-(0[13578]|1[02])\-((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\-(0[13456789]|1[012])\-((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\-02\-((19|[2-9]\d)\d{2}))|(29\-02\-((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$/g
источник
Критерии:
Каждый год, делимый на 4, является високосным, за исключением случаев, когда он делится на 100, если он не делится на 400. Итак:
В феврале 29 дней в високосном году и 28 дней в невисокосном.
30 дней в апреле, июне, сентябре и ноябре
31 день в январе, марте, мае, июле, августе, октябре и декабре
Тест:
Все следующие даты должны пройти проверку:
Следующие даты не пройдут валидацию:
Ассортимент:
Мы будем тестировать даты с 1 января 1000 г. по 31 декабря 2999 г. Технически используемый в настоящее время григорианский календарь вошел в употребление только в 1753 году для Британской империи и в разные годы 1600-х годов для стран Европы, но я не собираюсь беспокоиться об этом.
Регулярное выражение для проверки високосного года:
Годы, кратные 400:
Годы, кратные 4:
Годы, кратные 100:
Не делится на 100:
Годы, делимые на 100, но не на 400:
Делится на 4, но не на 100:
Високосные годы:
Не делится на 4:
Не високосный год:
Действительный месяц и день, кроме февраля (ММ-ДД):
Февраль с 28 днями:
Февраль с 29 днями:
Действительной датой:
Итак, у вас есть регулярное выражение для дат между 1 января 1000 и 31 декабря 2999 года в формате ГГГГ-ММ-ДД.
Я подозреваю, что его можно немного сократить, но я оставлю это кому-нибудь другому.
Это будет соответствовать всем действительным датам. Если вы хотите, чтобы он был действителен только тогда, когда он содержит только одну дату и ничего больше, оберните его
^( )$
так:Если вы хотите указать дополнительную дату (например, она может быть пустой или действительной), добавьте ее
^$|
в начале, например:источник
Сделать это можно так:
но вам лучше использовать этот:
в этом случае вы получите объект, который намного проще в использовании, чем просто строки.
источник
0175-44-19927
пройдет.Я знаю, что это старый вопрос. Но думаю, у меня есть хорошее решение.
Можешь попробовать. Если вы измените дату на 21.02.2016, эхо будет ложным. И если после этого вы измените формат на dmY, эхо будет истинным.
С помощью этого простого кода вы сможете проверить, какой формат даты используется, не проверяя его с помощью регулярного выражения.
Может быть, найдется человек, который проверит это в каждом случае. Но я думаю, что моя идея в целом верна. Мне это кажется логичным.
источник
Вы можете использовать preg_match с функцией php checkdate
источник
preg_match нуждается в / или другом символе в качестве разделителя.
вы также должны проверить действительность этой даты, чтобы не получить что-то вроде 9999-19-38
источник
Вы также можете сделать это так:
Это не только проверит формат, но и валидность даты self, так как
DateTime
будут созданы только действительные даты, и это должно соответствовать вводу.источник
ты можешь использовать
источник
Проверить и подтвердить
YYYY-MM-DD
дату в одной строке заявленияРезультат будет:
День и месяц без нуля в начале допустимы. Если вы не хотите этого допускать, регулярное выражение должно быть:
источник
Если вы хотите сопоставить этот тип даты, используйте:
источник
Это должно сказать вам, действителен ли формат и действительна ли дата ввода.
источник
Если это поможет, вот регулярное выражение для формата jnY (год должен быть больше 2018 года):
источник
источник
Наверное кому-нибудь пригодится:
источник
'1996-11-31 24:00'); // true
, действительно? Более того, иногда в минуте 61 секунда, см .: en.wikipedia.org/wiki/Leap_secondФункция для проверки общего формата даты:
Пример исполнения:
источник
Все зависит от того, насколько строгой вы хотите, чтобы эта функция была. Например, если вы не хотите, чтобы месяцы превышали 12 и дни превышали 31 (независимо от месяца, это потребовало бы написания логики дат), это может стать довольно сложным:
Лично я бы просто пошел на:
/^([0-9]{4}\-([0-9]{2}\-[0-9]{2})$/
источник
0[1-9]|1[0-2]
соответствует месяцам 01-12 и0[1-9]|[12][0-9]|3[01]
дням 01-31.Чтобы работать с датами в php, вы должны следовать стандарту php, чтобы данное регулярное выражение гарантировало, что у вас есть действительная дата, которая может работать с PHP.
источник
1980-01-01
но будет совпадать2100-02-29
Этот метод может быть полезен для проверки даты в PHP. Текущий метод предназначен для формата мм / дд / гггг. Вам необходимо обновить последовательность параметров в контрольной дате в соответствии с вашим форматом и разделителем в разнесении .
источник
[Если вы используете Symfony 4.1.2, попробуйте это] [1]
источник
Из Laravel 5.7 и формата даты, например: 31.12.2019
источник
Я искал «как проверить дату» и нашел это решение. Его старое, но я поделюсь ниже методом, который можно использовать для проверки даты в php,
источник