- PHP Regex для проверки даты в формате ГГГГ-ММ-ДД
- Date regex PHP
- Simple date regex (DD/MM/YYYY)
- Notes on date string regex validation
- Create an internal tool with UI Bakery
- Проверка данных регулярными выражениями
- Проверка чисел
- Проверка даты по формату
- Проверка номера телефона
- Проверка E-mail
- Логин
- Проверка md5-хэша
- Цвета
- IP адреса
- Комментарии
- Другие публикации
- Регулярное выражение формата даты
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 день в январе, марте, мае, июле, августе, октябре и декабре
Контрольная работа:
Следующие даты должны пройти проверку:
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
Комментарии
Другие публикации
Применение масок ввода у полей форм значительно упрощает их использование, уменьшает количество ошибок и приводит.
Несколько примеров, как сгенерировать случайные последовательности численных и буквенных строк заданной длины и.
Протокол FTP – предназначен для передачи файлов на удаленный хост. В PHP функции для работы с FTP как правило всегда доступны и не требуется установка дополнительного расширения.
В следующей таблице приведены имена констант (VK Codes), десятичные и шестнадцатеричные значения для кодов виртуальных.
В статье приведен пример формы и php-скрипта для безопасной загрузки файлов на сервер, возможные ошибки и рекомендации при работе с данной темой.
Регулярное выражение формата даты
Итак, перед нами стоит задача составить шаблон регулярного выражения для проверки строки на соответствие формату даты. Задача, в общем-то, типовая, а значит, можно предположить, что в сети уже есть готовые решения для нашей задачи. Это действительно так. На сайте regexlib.com в разделе готовых регулярок мы можем найти и наш случай:
Здесь на выбор есть даже несколько вариантов, которые могут работать с тем или иным форматом даты. Так что можем взять уже готовую регулярку, если она нам подойдет.
С готовыми решениями регулярных выражений для даты мы разобрались. Теперь давайте попробуем составить свое. Сформулируем техзадание. Итак, нам подходят даты форматов YYYY-MM-DD или YYYY/MM/DD. Прочие варианты даты нас не устраивают.
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
Собственно, задача довольно проста и решается буквально в течение минуты:
Давайте разберем этот шаблон:
Все вроде бы замечательно и наш шаблон работает. Однако что будет, если пользователь введет в качестве разделителя между цифрами в первой позиции один символ, а во второй — другой?
Упс! Оказывается шаблон пропускает неправильный формат даты. Как же разрешить использовать только один разделитель — тот, который используется на первой позиции? Здесь нам помогут обратные ссылки.
Смотрите, каждый разделитель мы заключили в скобки с тем, чтобы их сгруппировать и указать возможность альтернативы — (-|\/). Буквально это можно прочесть как — (тире или слеш). Но кроме группировки скобки выполняют и другую функцию. Скобки запоминают все то, с чем совпала в строке, заключенная в скобки часть шаблона.
Соответственно, встретив первый разделитель (тире или слеш), он будет запомнен. И доступен он будет по обратной ссылке. Обратные ссылки нумеруются и доступны в таком виде: \1, \2…
То есть, на первый выбранный разделитель ссылается такая ссылка — \1. Она доступна внутри шаблона регулярного выражения, а потому мы можем вместо альтернативы для второго разделителя просто указать обратную ссылку, которая будет ссылаться на введенный первый разделитель:
Онлайн курс «PHP-разработчик»
Изучите курс и создайте полноценный проект — облачное хранилище файлов
С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.
А вот теперь все работает, как мы и задумывали, регулярное выражение для проверки даты составлено и успешно работает. Ну а на этом у меня сегодня все. Больше о регулярных выражениях вы можете узнать из нашего курса по регулярным выражениям. Удачи!