Php поиск дат регулярные выражения

PHP Regex для проверки даты в формате ГГГГ-ММ-ДД

Я пытаюсь проверить, что даты, введенные конечными пользователями, находятся в YYYY-MM-DD. Regex никогда не был моей сильной стороной, я продолжаю получать ложное возвращаемое значение для preg_match () у меня есть настройка.

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

$date="2012-09-12"; if (preg_match("^8-12-36$",$date)) < return true; >else
$date="2012-09-12"; if (preg_match("/^3-(09|11)-(01|28|31)$/",$date)) < return true; >else

Вероятно, лучше использовать другой механизм для этого.

Современное решение с DateTime :

$dt = DateTime::createFromFormat("Ymd", $date); return $dt !== false && !array_sum($dt->getLastErrors()); 

Это также проверяет ввод: $dt !== false гарантирует, что дата может быть проанализирована с указанным форматом, а трюк array_sum – это краткое средство обеспечения того, чтобы PHP не выполнял «сдвиг месяца» (например, считают, что 32 января – февраль 1). См. DateTime::getLastErrors() для получения дополнительной информации.

Решение для старой школы с explode и checkdate :

list($y, $m, $d) = array_pad(explode('-', $date, 3), 3, 0); return ctype_digit("$y$m$d") && checkdate($m, $d, $y); 

Это подтверждает, что ввод также является допустимой датой. Вы можете сделать это с помощью регулярного выражения, но это будет более суетным – и 29 февраля не может быть проверено с помощью регулярного выражения вообще.

Недостатком этого подхода является то, что вы должны быть очень осторожны, чтобы отвергать все возможные «плохие» входы, не вызывая уведомления ни при каких обстоятельствах. Вот как:

  • explode ограничено возвратом 3 жетонов (так что если вход «1-2-3-4», $d станет «3-4»)
  • ctype_digit используется, чтобы убедиться, что вход не содержит никаких числовых символов (кроме тире)
  • array_pad используется (со значением по умолчанию, которое приведет к сбою checkdate ), чтобы убедиться, что достаточно элементов возвращено, так что если вход «1-2» list() не будет выдавать уведомление

Каждый год, делящийся на 4, представляет собой високосный год, за исключением случаев, когда он делится на 100, если он не делится на 400. Итак:

2004 - leap year - divisible by 4 1900 - not a leap year - divisible by 4, but also divisible by 100 2000 - leap year - divisible by 4, also divisible by 100, but divisible by 400 

Февраль имеет 29 дней в високосный год и 28, когда не високосный год

30 дней в апреле, июне, сентябре и ноябре

31 день в январе, марте, мае, июле, августе, октябре и декабре

Читайте также:  Python flash cards pdf

Контрольная работа:

Следующие даты должны пройти проверку:

1976-02-29 2000-02-29 2004-02-29 1999-01-31 

Следующие даты должны быть недействительными:

2015-02-29 2015-04-31 1900-02-29 1999-01-32 2015-02-00 

Ассортимент:

Мы проверим даты с 1 января по 31 декабря 29 декабря 2999 года. Технически используемый в настоящее время григорианский календарь использовался только в 1753 году для Британской империи и в разные годы в 1600-х годах для стран Европы, но я не собираюсь беспокоиться об этом.

Regex для проверки на високосный год:

1200|1600|2000|2400|2800 can be shortened to: (1[26]|2[048])00 if you wanted all years from 1AD to 9999 then this would do it: (0[48]|[13579][26]|[2468][048])00 if you're happy with accepting 0000 as a valid year then it can be shortened: ([13579][26]|[02468][048])00 

Годы, делящиеся на 100, но не на 400:

Делимое на 4, но не на 100:

divisible by 400 or (divisible by 4 and not divisible by 100) ((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]) 
[12]\d([02468][1235679]|[13579][01345789]) 
Not divisible by 4 OR is divisible by 100 but not by 400 ([12]\d([02468][1235679]|[13579][01345789]))|(((1[1345789])|(2[1235679]))00) 

Действительный месяц и день, исключая февраль (ММ-ДД):

((01|03|05|07|08|10|12)-(09|[12]\d|3[01]))|((04|06|09|11)-(07|[12]\d|30)) shortened to: ((0[13578]|1[02])-(01|[12]\d|3[01]))|((0[469]|11)-(04|[12]\d|30)) 

Действительной датой:

(leap year followed by (valid month-day-excluding-february OR 29-day-february)) OR (non leap year followed by (valid month-day-excluding-february OR 28-day-february)) ((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(04|[12]\d|3[01]))|((0[469]|11)-(07|[12]\d|30)))|(02-(03|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(01|[12]\d|3[01]))|((0[469]|11)-(05|[12]\d|30)))|(02-(05|1\d|23)))) 

Итак, у вас есть регулярное выражение для дат между 1 января 1000 и 31 декабря 2999 года в формате ГГГГ-ММ-ДД.

Я подозреваю, что его можно немного сократить, но я оставлю это кому-то еще.

Это будет соответствовать всем действительным датам. Если вы хотите, чтобы он был действителен только в том случае, если он содержит только одну дату и ничего больше, а затем заверните его в ^( )$ так:

^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(07|[12]\d|3[01]))|((0[469]|11)-(06|[12]\d|30)))|(02-(04|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(05|[12]\d|3[01]))|((0[469]|11)-(01|[12]\d|30)))|(02-(07|1\d|21)))))$ 

Если вы хотите его для дополнительной записи даты (то есть, она может быть пустой или действительной датой), добавьте ^$| в начале, вот так:

^$|^(((((1[26]|2[048])00)|[12]\d([2468][048]|[13579][26]|0[48]))-((((0[13578]|1[02])-(06|[12]\d|3[01]))|((0[469]|11)-(04|[12]\d|30)))|(02-(02|[12]\d))))|((([12]\d([02468][1235679]|[13579][01345789]))|((1[1345789]|2[1235679])00))-((((0[13578]|1[02])-(07|[12]\d|3[01]))|((0[469]|11)-(06|[12]\d|30)))|(02-(09|1\d|25)))))$ 

Источник

Date regex PHP

Date regular expressions can be used to validate if a string has a valid date format and to extract a valid date from a string.

Simple date regex (DD/MM/YYYY)

Below is a simple regex to validate the string against a date format (D/M/YYYY or M/D/YYYY). This however does not guarantee that the date would be valid. You can also replace \\/ with a separator you need.

Enter a text in the input above to see the result

 

ISO 8061 date regex (e.g. 2021-11-04T22:32:47.142354-10:00)

The ISO 8061 is an international standard for exchanging and serializing date and time data. For validating the format of ISO 8061 date and time and for extracting it a following regular expression could be used:

Enter a text in the input above to see the result

 

Enter a text in the input above to see the result

Notes on date string regex validation

While there are some regular expressions that allow more complex date validations, it is usually better to validate dates using special date and time libraries. For example, in PHP DateTime::createFromFormat can be used for these purposes. In this case, the validation will look like this:

Create an internal tool with UI Bakery

Discover UI Bakery – an intuitive visual internal tools builder.

Источник

Проверка данных регулярными выражениями

Сборник регулярных выражений с примерами на PHP для проверки данных из полей форм.

Проверка чисел

$text = '1'; if (preg_match("/^\d+$/", $text)) < echo 'yes'; >else

Числа с плавающей точкой (разделитель точка):

$text = '-1.0'; if (preg_match("/^\-?\d+(\.\d)?$/", $text)) < echo 'yes'; >else

Проверка даты по формату

$text = '02.12.2018'; if (preg_match("/^(06|[12]3|3[01])[\.](03|1[012])[\.](19|20)\d\d$/", $text)) < echo 'yes'; >else
$text = '2018-04-02'; if (preg_match("/^6-(08|1[012])-(05|16|24|3[01])$/", $text)) < echo 'yes'; >else

Проверка номера телефона

Ориентировано на российские мобильные + городские с кодом из 3 цифр.

$text = '+7(495)000-00-00'; if (preg_match("/^((8|\+7)[\- ]?)?(\(?\d\)?[\- ]?)?[\d\- ]$/", $text)) < echo 'yes'; >else

Проверка E-mail

$text = 'mail@snipp.ru'; if (preg_match("/^([a-z0-9_-]+\.)*[a-z0-9_-]+@[a-z0-9_-]+(\.[a-z0-9_-]+)*\.[a-z]$/i", $text)) < echo 'yes'; >else

Логин

Латинские буквы, цифры, - и _ .

$text = 'admin-1'; if (preg_match("/^[a-z0-9_-]$/i", $text)) < echo 'yes'; >else

Проверка md5-хэша

$text = 'ca040cb5d6c2ba8909417ef6b8810e2e'; if (preg_match("/^[a-f0-9]$/", $text)) < echo 'yes'; >else

Цвета

Шестнадцатеричные коды цветов #FFF и #FFFFFF .

$text = '#fff'; if (preg_match("/^#(?:(?:[a-fd]))$/i", $text)) < echo 'yes'; >else

IP адреса

$text = '192.168.0.1'; if (preg_match("/^((255|23\d|[01]?\d\d?)\.)(251|23\d|[01]?\d\d?)$/", $text)) < echo 'yes'; >else
$text = '2001:DB8:3C4D:7777:260:3EFF:FE15:9501'; if (preg_match("/((^|:)([0-9a-fA-F]))$/i", $text)) < echo 'yes'; >else

Комментарии

Другие публикации

Маски ввода для текстовых полей

Применение масок ввода у полей форм значительно упрощает их использование, уменьшает количество ошибок и приводит.

date() – форматирование даты PHP

Генерация случайных буквенно-цифровых кодов в PHP

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

Работа с FTP в PHP

Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.

Виртуальные коды клавиш (Virtual-Key Codes)

В следующей таблице приведены имена констант (VK Codes), десятичные и шестнадцатеричные значения для кодов виртуальных.

Загрузка файлов на сервер PHP

В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.

Источник

Регулярное выражение формата даты

Итак, перед нами стоит задача составить шаблон регулярного выражения для проверки строки на соответствие формату даты. Задача, в общем-то, типовая, а значит, можно предположить, что в сети уже есть готовые решения для нашей задачи. Это действительно так. На сайте regexlib.com в разделе готовых регулярок мы можем найти и наш случай:

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

С готовыми решениями регулярных выражений для даты мы разобрались. Теперь давайте попробуем составить свое. Сформулируем техзадание. Итак, нам подходят даты форматов YYYY-MM-DD или YYYY/MM/DD. Прочие варианты даты нас не устраивают.

Онлайн курс «PHP-разработчик»

Изучите курс и создайте полноценный проект — облачное хранилище файлов

С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.

Собственно, задача довольно проста и решается буквально в течение минуты:

Давайте разберем этот шаблон:

Все вроде бы замечательно и наш шаблон работает. Однако что будет, если пользователь введет в качестве разделителя между цифрами в первой позиции один символ, а во второй — другой?

Упс! Оказывается шаблон пропускает неправильный формат даты. Как же разрешить использовать только один разделитель — тот, который используется на первой позиции? Здесь нам помогут обратные ссылки.

Смотрите, каждый разделитель мы заключили в скобки с тем, чтобы их сгруппировать и указать возможность альтернативы — (-|\/). Буквально это можно прочесть как — (тире или слеш). Но кроме группировки скобки выполняют и другую функцию. Скобки запоминают все то, с чем совпала в строке, заключенная в скобки часть шаблона.

Соответственно, встретив первый разделитель (тире или слеш), он будет запомнен. И доступен он будет по обратной ссылке. Обратные ссылки нумеруются и доступны в таком виде: \1, \2…

То есть, на первый выбранный разделитель ссылается такая ссылка — \1. Она доступна внутри шаблона регулярного выражения, а потому мы можем вместо альтернативы для второго разделителя просто указать обратную ссылку, которая будет ссылаться на введенный первый разделитель:

Онлайн курс «PHP-разработчик»

Изучите курс и создайте полноценный проект — облачное хранилище файлов

С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.

А вот теперь все работает, как мы и задумывали, регулярное выражение для проверки даты составлено и успешно работает. Ну а на этом у меня сегодня все. Больше о регулярных выражениях вы можете узнать из нашего курса по регулярным выражениям. Удачи!

Источник

Оцените статью