Регулярные выражения php проверка даты
Подборка шаблонов регулярных выражений
В языке программирования, в частности PHP, регулярные выражения представляют из себя специальные записи «маски», с помощью которых может производиться анализ значений каких-либо переменных согласно установленному шаблону. Удобство использования регулярных выражений в скриптах играет существенную роль, так как программирование само по себе подразумевает работу с данными.
Теперь о том, где могут быть использованы регулярные выражения. К примеру, у вас на сайте есть какая либо форма, которая содержит некоторый набор полей, их предположительно должен заполнить пользователь, и отправить на сервер. На стороне сервера нужно проверять данные на корректность ввода, и тут могут пригодиться регулярные выражения. На самом деле регулярки, как их называют по-простому, могут использоваться в различных участках кода, там, где есть необходимость произвести анализ данных, для дальнейших манипуляций с ними.
Ранее в нашем блоге так же публиковались статьи о парсинге текста и замене в них ссылок, извлечении ссылок из веб-страниц, и т.д. В отборе нужных данных из общей массы там так же используются регулярные выражения.
В данном посту я решил сделать подборку популярных выражений, которые могут пригодиться на практике многократно.
Регулярное выражение для проверки логина:
Регулярное выражение для проверки набора букв и цифр русского и английского алфавита:
Регулярное выражение для проверки корректности доменного имени сайта:
Регулярное выражение для проверки корректности md5-хэша:
Регулярное выражение для проверки шестнадцатеричного значения цвета:
Регулярное выражение для проверки IPv4 адреса:
Регулярное выражение для проверки IPv6 адреса:
Регулярное выражение для проверки MAC-адреса:
Регулярное выражение для проверки даты в формате YYYY-MM-DD:
Регулярное выражение для проверки даты в формате DD/MM/YYYY:
Регулярное выражение для проверки времени в формате HH:MM:SS
Статейка будет постепенно дополняться, предлагаю оставлять свои варианты шаблонов регулярных выражений для проверки, не забываем сохранить страничку в закладки:)
Пример использования регулярного выражения:
Регулярное выражение формата даты
Дата публикации: 2016-08-10
От автора: приветствую вас друзья. В этой статье мы с вами научимся составлять регулярное выражение для валидации даты и проверки формата даты. Приступим?
Итак, перед нами стоит задача составить шаблон регулярного выражения для проверки строки на соответствие формату даты. Задача, в общем-то, типовая, а значит, можно предположить, что в сети уже есть готовые решения для нашей задачи. Это действительно так. На сайте regexlib.com в разделе готовых регулярок мы можем найти и наш случай:
Здесь на выбор есть даже несколько вариантов, которые могут работать с тем или иным форматом даты. Так что можем взять уже готовую регулярку, если она нам подойдет.
С готовыми решениями регулярных выражений для даты мы разобрались. Теперь давайте попробуем составить свое. Сформулируем техзадание. Итак, нам подходят даты форматов YYYY-MM-DD или YYYY/MM/DD. Прочие варианты даты нас не устраивают.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Собственно, задача довольно проста и решается буквально в течение минуты:
Давайте разберем этот шаблон:
\d <4>— 4 цифры, идущие подряд
\d <2>— 2 цифры, идущие подряд
Все вроде бы замечательно и наш шаблон работает. Однако что будет, если пользователь введет в качестве разделителя между цифрами в первой позиции один символ, а во второй — другой?
Упс! Оказывается шаблон пропускает неправильный формат даты. Как же разрешить использовать только один разделитель — тот, который используется на первой позиции? Здесь нам помогут обратные ссылки.
Смотрите, каждый разделитель мы заключили в скобки с тем, чтобы их сгруппировать и указать возможность альтернативы — (-|\/). Буквально это можно прочесть как — (тире или слеш). Но кроме группировки скобки выполняют и другую функцию. Скобки запоминают все то, с чем совпала в строке, заключенная в скобки часть шаблона.
Соответственно, встретив первый разделитель (тире или слеш), он будет запомнен. И доступен он будет по обратной ссылке. Обратные ссылки нумеруются и доступны в таком виде: \1, \2…
То есть, на первый выбранный разделитель ссылается такая ссылка — \1. Она доступна внутри шаблона регулярного выражения, а потому мы можем вместо альтернативы для второго разделителя просто указать обратную ссылку, которая будет ссылаться на введенный первый разделитель:
А вот теперь все работает, как мы и задумывали, регулярное выражение для проверки даты составлено и успешно работает. Ну а на этом у меня сегодня все. Больше о регулярных выражениях вы можете узнать из нашего курса по регулярным выражениям. Удачи!
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Хотите изучить регулярные выражения на PHP?
Посмотрите 12-ти часовой видео курс по регулярным выражениям на PHP!
PHP Regex для проверки даты в формате ГГГГ-ММ-ДД
Я пытаюсь проверить, что даты, введенные конечными пользователями, находятся в YYYY-MM-DD. Regex никогда не был моей сильной стороной, я продолжаю получать ложное возвращаемое значение для preg_match () у меня есть настройка.
Поэтому я предполагаю, что я создал беспорядок регулярного выражения, подробно описанный ниже.
Вероятно, лучше использовать другой механизм для этого.
Современное решение с DateTime :
Решение для старой школы с explode и checkdate :
Это подтверждает, что ввод также является допустимой датой. Вы можете сделать это с помощью регулярного выражения, но это будет более суетным – и 29 февраля не может быть проверено с помощью регулярного выражения вообще.
Недостатком этого подхода является то, что вы должны быть очень осторожны, чтобы отвергать все возможные «плохие» входы, не вызывая уведомления ни при каких обстоятельствах. Вот как:
Критерии:
Каждый год, делящийся на 4, представляет собой високосный год, за исключением случаев, когда он делится на 100, если он не делится на 400. Итак:
Февраль имеет 29 дней в високосный год и 28, когда не високосный год
30 дней в апреле, июне, сентябре и ноябре
31 день в январе, марте, мае, июле, августе, октябре и декабре
Контрольная работа:
Следующие даты должны пройти проверку:
Следующие даты должны быть недействительными:
Ассортимент:
Мы проверим даты с 1 января по 31 декабря 29 декабря 2999 года. Технически используемый в настоящее время григорианский календарь использовался только в 1753 году для Британской империи и в разные годы в 1600-х годах для стран Европы, но я не собираюсь беспокоиться об этом.
Regex для проверки на високосный год:
Годы, делящиеся на 400:
Годы, делящиеся на 4:
Годы, делящиеся на 100:
Годы, делящиеся на 100, но не на 400:
Делимое на 4, но не на 100:
Действительный месяц и день, исключая февраль (ММ-ДД):
Февраль с 28 днями:
Февраль с 29 днями:
Действительной датой:
Итак, у вас есть регулярное выражение для дат между 1 января 1000 и 31 декабря 2999 года в формате ГГГГ-ММ-ДД.
Я подозреваю, что его можно немного сократить, но я оставлю это кому-то еще.
Это будет соответствовать всем действительным датам. Если вы хотите, чтобы он был действителен только в том случае, если он содержит только одну дату и ничего больше, а затем заверните его в ^( )$ так:
Если вы хотите его для дополнительной записи даты (то есть, она может быть пустой или действительной датой), добавьте ^$| в начале, вот так:
Вы можете сделать это так:
но вам лучше использовать это:
в этом случае вы получите объект, который проще использовать, чем просто строки.
Вы можете использовать preg_match с функцией checkdate php
preg_match нуждается в / или другом символе в качестве разделителя.
вы также должны проверить действительность этой даты, чтобы у вас не получилось что-то вроде 9999-19-38
Я знаю, что это старый вопрос. Но я думаю, что у меня есть хорошее решение.
Можешь попробовать. Если вы измените дату на 21.02.2016, эхо будет ложным. И если вы измените формат после этого на dmY, эхо будет истинным.
С помощью этого простого кода вы сможете проверить, какой формат даты используется, не проверяя его регулярным выражением.
Может быть, есть человек, который будет проверять его на каждом случае. Но я думаю, что моя идея в целом действительна. Для меня это кажется логичным.
Если вы хотите сопоставить этот тип даты, используйте:
Это должно сказать вам, является ли формат действительным, и если дата ввода действительна.
Все зависит от того, насколько строго вы хотите, чтобы эта функция была. Например, если вы не хотите разрешать месяцы выше 12 и дней выше 31 (не в зависимости от месяца, для чего потребуется запись даты-логики), это может стать довольно сложным:
Лично я бы просто пошел за: /^(5<4>\-(7<2>\-3<2>)$/
Чтобы работать с датами в php, вы должны следовать стандарту php, поэтому данное регулярное выражение гарантирует, что у вас есть действительная дата, которая может работать с PHP.
Проверка и проверка YYYY-MM-DD в одной строке
Допускаются день и месяц без начального нуля. Если вы не хотите разрешать это, регулярное выражение должно быть:
Проверка данных регулярными выражениями в PHP
Содержание:
Сборник основных шаблонов регулярных выражений на PHP для проверки данных.
Проверка набора из латинских букв и цифр
Регулярное выражение для проверки набора только из латинских букв и цифр:
Если необходимо добавить в набор некоторые символы:
Проверка на кириллицу и цифры
Регулярное выражение для проверки набора только из букв кириллицы и цифр:
Проверка на число
Регулярное выражение для проверки данных на целое число:
Регулярное выражение для проверки данных на тип Float (числа с плавающей точкой):
Проверка логина
Регулярное выражение для проверки логина. Разрешено использовать только латинские буквы, цифры, тире и знак подчёркивания. Длина логина от 2 до 20 символов (включительно):
Проверка Email
Регулярное выражение для проверки Email:
Проверка номера телефона
Регулярное выражение для проверки номера телефона:
Проверка даты по формату
Формат MySQL YYYY-MM-DD :
Проверка md5-хэша
Регулярное выражение для проверки на корректность md5-хэша:
Проверка IP адресов
Регулярное выражение для проверки IPv4 адреса:
Проверка IPv6 адреса:
Проверка доменного имени
Регулярное выражение для проверки на корректность доменного имени сайта:
PHP и регулярные выражения: азы для новичков
В преддверии старта нового потока по курсу «Backend-разработчик на PHP», а также смежного с ним курса «Framework Laravel», хотим поделиться статьей, которую подготовил наш внештатный автор.
Внимание! данная статья не имеет отношения к программе курса и будет полезна только для новичков. Для получения более углубленных знаний приглашаем вас посетить бесплатный двухдневный онлайн интенсив по теме: «Создание Telegram-бота для заказа кофе в заведении и оплаты онлайн». Второй день интенсива будет проходить тут.
Всем привет! Всех с наступившим [20]<2,>0 годом. Сегодня я хочу затронуть тему, которая иногда является темой для шуток от «Да зачем тебе все это учить, если есть уже есть готовые решения» до «может тебе еще и весь Perl выучить?». Однако время идет, множество программистов начинают осваивать регулярные выражения, а на Хабре нет ни одной свежей (хоть регулярные выражения не слишком изменились за последнее время) статьи на этой тематику. Пришло время написать ещё одну!
Регулярные выражения в отрыве от их конкретной реализации
Регулярные выражения (обозначаемые в английском как RegEx или как regex) являются инструментальным средством, которое применяется для различных вариантов изучения и обработки текста: поиска, проверки, поиска и замены того или иного элемента, состоящего из букв или цифр (или любых других символов, в том числе специальных символов и символов пунктуации). Изначально регулярные выражения пришли в мир программирования из среды научных исследований, которые проводились в 50-е годы в области математики.
Спустя десятилетия принципы и идеи были перенесены в среду операционной системы UNIX (в частности вошли в утилиту grep ) и были реализованы в языке программирования Perl, который на заре интернета широко использовался на бэкенде (и по сей день используется, но уже меньше) для такой задачи, как, например, валидация форм.
Если они вроде простые, тогда почему такие страшные на первый взгляд?
На самом деле любое выражение может быть «регулярным» и применяться для проверки или поиска каких-либо символов. Например, слова Pavel или example@mail.ru тоже могут использоваться как регулярки, только, понятное дело, в довольно узком ключе. Для проверки работы регулярных выражений в среде PHP без запуска своего сервера или хостинга вы можете воспользоваться следующим онлайн сервисом (вот только на нем у меня не работала обработка русских символов). Для начала в качестве регулярного выражения мы используем просто Pavel.
Положим у нас есть следующий текст:
Pavel knows too much. Pavel using nginx and he’s not rambler.
Сейчас регулярные выражения нашли оба вхождения слова Pavel. Здорово, но звучит не очень полезно (разве что только вы зачем-то пытаетесь проанализировать что-то вроде количества упоминания слова сударь в Войне и Мире через Vim и Python, но тогда у меня к вам вопросов нет).
Вариативность выражения
Если ваше регулярное выражение вариативно (например, вам известна только некоторая его часть и нужно найти количество вхождений годов, начиная от 2000 и заканчивая 2099), то мы можем использовать следующее регулярное выражение: 20..
Текст: Молодые писатели пишут много чего. Например писатель 2002 года рождения очень отличается от 2008 и 2012
Здесь у нас с помощью регулярного выражения найдутся все годы, но пока в этом нет никакого смысла. Скорее всего нам не нужны годы дальше 2012 (хотя молодые писатели младше 8 лет могут обидеться, но не об этом сейчас). Стоит изучить наборы символов, но об этом попозже, потому как сейчас поговорим про другую важную часть регулярных выражений: экранирование метасимволов.
Регулярное выражение: \.doc
Совпадение с целым набором символов
Регулярное выражение: 1\.jpg
Текст: 1.jpg, 2.jpg, 3.jpg, photo.jpg, anime.jpg, 8.jpg, jkl.jpg
Стоит отметить, что имя файлов из более 1 цифры наше регулярное выражение не охватит. Про множественный выбор будет чуть ниже, а пока представим, что нам вдруг понадобилось добиться обратного результата. Добавим метасимвол ^ (у которого, самое противное, в регулярных выражениях есть аж две функции). Чтобы воспользоваться им как исключением, нужно добавить его именно внутрь нашего набора:
Регулярное выражение: [^0-9]\.jpg
Но без множественного выбора это конечно неполноценные выражения.
Полезные таблицы
Приведем таблицу метасимволов:
\ | экранировать метасимвол как обычный символ |
^ | искать определенный символ именно в начале строки (но только если исключить его из набора []) |
$ | конец строки |
| | альтернатива |
() | группировка |
\w | все буквенно и цифровые символы (многие руководства почему-то не договаривают про цифровые символы) |
\W | тоже самое, только наоборот |
\s | любой пробельный символ |
\S | любой НЕ пробельный символ |
Таблица пробельных метасимволов
[\b] | возврат на один символ |
\f | перевод страницы |
\n | перевод строки |
\r | возрат каретки |
\t | табуляция |
\v | вертикальная табуляция |
Множественный выбор: делаем простую валидацию
Регулярное выражение: \b\w<1,3>\b:
Неплохо! Теперь слова короче трех букв не смогут попадать в нашу базу данных. Посмотрим на валидацию почтового адреса:
Регулярное выражение: \w+@\w+\.\w+
Подробнее рассмотрим повторение символов
Теперь давайте поподробнее разберем, как можно в регулярных выражениях задать повторение символов. К примеру вы хотите найти любые комбинации цифр от 2-6 в тексте:
Регулярное выражение: 3+
Давайте я приведу таблицу всех квантификаторов метасимволов:
* | символы повторяются 0 и до бесконечности |
+ | повторяются от 1 и до бесконечности |
повторяются точно n раз | |
от n и до бесконечности | |
от n1 и до n2 раз точно | |
? | 0 или 1 символ, не больше |
В применении квантификаторов нет ничего сложного. Кроме одного нюанса: жадные и ленивые квантификаторы. Приведем таблицу:
Ленивые квантификаторы отличаются от жадных тем, что они выхватывают минимальное, а не максимальное количество символов. Представим, что есть у нас задача найти все теги заголовков h1-h6 и их контент, а весь остальной текст не должен быть затронут (я умышленно ввел несуществующий тэг h7, чтобы не мучаться с экранированием хабровских тэгов):
Текст: h7 > hello h7 > lorem ipsum avada kedavra h7 > buy /h7 >
Все сработало успешно, однако только благодаря ленивому квантификатору. В случае применения жадного квантификатора у нас выделился бы весь текст между тегами (полагаю, в иллюстрации это не нуждается).
Границы символьных строк
Границы символьных строк мы уже использовали выше. Приведем здесь более подробную таблицу:
\b | граница слова |
\B | не граница слова |
\A | начало строки |
\Z | конец строки |
\G | конец действия |
Работа с подвыражениями
Текст: 255.255.255.255 просто адрес
191.198.174.192 wikipedia
87.240.190.67 vk
31.13.72.36 facebook
Здесь используется логический оператор | (или), который позволяет нам составить регулярное выражение, которое соответствует правилу, по которому составляются IP- адреса. В IP адресе должно быть от 1 и до 3 цифр, в котором число из трех чисел может начинаться с 1, с 2 (или тогда вторая цифра должна быть в пределах от 0 и до 4), или начинаться с 25, и тогда 3 цифра оказывается в пределах от 0 и до 5. Также между каждой комбинацией цифр должна стоять точка. Используя приведенные выше таблицы, постарайтесь сами расшифровать регулярное выражение сверху. Регулярные выражения в начале пугают своей длинной, но длинные не значит сложные.
Просмотр вперед
Приведем конкретную задачу: есть пароль, который должен состоят не менее чем из 7 символов и должен обязательно включать как минимум одну заглавную букву и цифру. Здесь все будет несколько сложнее, потому как пользователь должен иметь возможность поставить заглавную букву как в начале, так и в середине предложения (и тоже самое должно повторяться с буквой).
Следовательно, нам потребуется просмотр выражения вперед. Кроме того, нам нужно разбить на группы знаки. И я хочу ограничить его размеры от 8 и до 22 знаков:
Текст: Qwerty123
Im789098
weakpassword
Особенности работы регулярных выражений именно в PHP
Для изучения работы регулярных выражений в PHP, изучите функции в официальной документации PCRE (Perl Compatible Regular Expressions) которая доступна на официальном сайте. Выражение должно быть заключено в разделители, например, в прямые слеши.
Разделителем могут выступать произвольные символы, кроме буквенно-цифровых, обратного слеша ‘\’ и нулевого байта. Если символ разделителя встречается в шаблоне, его необходимо экранировать \. В качестве разделителей доступны комбинации, пришедшие из Perl: (), <>, [].
Какие функции используются в php? В пакете PCRE предоставляются следующие функции для поддержки регулярных выражений:
Замещающие строки допускается вычислять в виде кода PHP. Для активизации данного режима служит модификатор e.
Наша статья была бы неполной без классов символов POSIX, которые также работают в PHP (и в общем вполне могут повысить читабельность ваших регулярок, но не все их спешат учить, потому как часто ломают логику выражения).
[[:alnum:]] | Любая буква английского алфавита или цифра |
[[:alpha:]] | Любая буква ([a-zA-Z]) |
[[:blank:]] | Пробельный символ или символ с кодом 0 и 255 |
[[:digit:]] | Любая цифра (4) |
[[:lower:]] | Любая строчная буква английского алфавита ([a-z]) |
[[:upper:]] | Любая заглавная буква английского алфавита ([A-Z]) |
[[:punct:]] | Любой знак пунктуации |
[[:space:]] | Любой пробельный символ |
[[:xdigit:]] | Любая шестнадцатеричная цифра ([0-9a-fA-F]) |
Под конец приведу пример конкретной реализации регулярных выражений в PHP, используя упомянутые выше реализации. Также я добавил валидацию имени пользователя, чтобы он не смог вводить слишком короткие сочетания букв (ну, положим, это никнеймы, а не имена, имена бывают короче двух букв):
Всем спасибо за внимание! Конечно, сегодня мы затронули только часть регулярных выражений и о них можно написать ещё несколько статей. К примеру, мы не поговорили о реализации поиска повторений одинаковых слов в тексте. Но я надеюсь, что полученных знаний хватит, чтобы осмысленно написать свою первую валидацию формы и уже потом перейти к более зубодробительным вещам.
По традиции, несколько полезных ссылок:
Шпаргалка от MIT по регулярным выражениям
Официальная часть документации php по регулярным выражениям.
На этом все. До встречи на интенсиве!
Второй день интенсива пройдет тут