Конструктор регулярных выражений php
Помощники в создании регулярных выражений
В настоящее время сложно представить разработку сайтов и приложений без использования регулярных выражений (если только сайт или приложение простенькое). Ведь регулярные выражения представляют собой формальный язык поиска и осуществления манипуляций с подстроками в тексте, который основан на использовании метасимволов (wildcard characters).
Конструктор регулярных выражений
Интересный конструктор регулярных выражений (regexp online generator) для PHP и Javascript. На момент тестирования не корректно работал с регулярными выражениями для PHP, в которых используются русские символы (возникала ошибка в момент вывода результатов). А так, если откинуть данный момент, то вполне неплохой конструктор, в котором можно по практиковаться с составлением различных выражений.
Regular Expression Library
На сайте есть много интересных паттернов регулярных выражений, а также возможность их протестировать прямо на сайте. На данный момент свыше 6500+ регулярных выражений от разных участников проекта. Хорошая возможность подсмотреть или найти для себя нужное регулярное выражение.
Еще один простой конструктор регулярных выражений, совместимых с Perl. Вариант для тех, кому не нужно ничего лишнего для создания регулярного выражения.
Генератор правил валидации
Под конец написании статьи нашел еще один интересный сервис для создания регулярных выражений из сопоставляемой строки. Для начала работы достаточно ввести значение в данное поле и нажать на кнопку «Генерировать». После чего вы сами увидите появившееся регулярное выражение в поле RegEx. А вот в тестовом поле можно ввести другое значение, если все правильно, то будет выдан результат о корректности заполнения в соответствии с регуляркой.
Конечно, ресурс не является панацеей при создании новых правил, но тем не менее порой помогает быстро создать новое выражение даже не опытному в этой области человеку.
Ну и еще один конструктор регулярных выражений — RegExr. Аналог PCRE, возможно покажется кому-то более удобным.
Regular Expressions 101
Вот недавно нашел еще одного интересного помощника при составлении регулярных выражений. В нем можно выбрать вид регулярных выражений для PHP, Python, JavaScript или Golang. Есть даже небольшая библиотека готовых выражений.
Хочется сказать, что подобных конструкторов много, но я привел самые наиболее интересные. Возможно вы используете какой-то другой — буду рад вашим комментариям. Следите за обновлениями на моем сайте.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Как выбрать конструктор регулярных выражений для PHP
Дата публикации: 2017-03-21
От автора: дорогие товарищи, я попал! Мне редактура все подсыпает и подсыпает ТЗ на написание материалов по регулярным выражениям. А я их страх как не люблю. Но сегодня расслабимся немного – подберем для себя один из конструкторов регулярных выражений PHP и другие «облегчалки», чтоб потом меньше голова болела.
Варианты
Вот несколько сервисов, которые облегчают создание и тестирование регулярок: uvsoftium.ru
Сервис имеет простой и понятный интерфейс на русском, что во многом облегчает понимание всего «происходящего». Внизу находится напоминалка с описанием основного синтаксиса составления регулярных выражений. Рекомендую к использованию!
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Еще один для регулярных выражений PHP онлайн конструктор с русскоязычным интерфейсом. Кроме функции, с помощью которой следует обрабатывать регулярку, здесь можно установить кодировку строки: utf-8 или cp1251.
Специализированный сервис для работы, тестирования и обучения обращению с регулярками. На нем вы сможете найти множество справочных материалов, но, к сожалению, все они на английском, как и весь пользовательский интерфейс.
Также на этой платформе имеется несколько дополнительных инструментов. Среди них удобный конструктор для PHP скриптов, который генерирует программный код «по мотивам» введенного регулярного выражения.
Самый правильный для русского человека сервис обращения с регулярками. По сравнению со своими «собратьями» он имеет целый ряд преимуществ. Его интерфейс поддерживает русский язык. Кроме этого, если вы не знаете ничего о регулярных выражениях, то можете пополнить свой багаж знаний, пройдя короткий интерактивный курс.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Конструктор снабжен правильными примерами, на основе которых легко составить свое регулярное выражение для валидации. Поэтому с применением этого PHP конструктора у вас не должно возникнуть никаких затруднений. Однозначно рекомендую данный сервис для новичков!
Конструктор немного «не в тему», поскольку заточен только под создания регулярок для JavaScript. Но так как эта технология тесно сплетается с PHP, то его тоже можно рекомендовать к применению.
Кроме онлайн-сервисов для создания регулярных выражений существует несколько десктопных вариантов. Вот несколько из них:
Другие облегчалки
Если речь уж зашла об инструментах, облегчающих нелегкий труд PHP-разработчика, то стоит перечислить и другие популярные специализированные онлайн-сервисы:
Мало кто знает, что глобальный поисковик предлагает для использования свой бесплатный конструктор сайтов PHP. Сервис имеет простой интерфейс и сопровождает создание ресурса интерактивными подсказками.
Позволяет проверить сайт на наличие устаревших библиотек, выявить проблемы компоновки и другие недочеты. Сервис предоставляется Microsoft, так что «зачетный» инструмент для сайтостроителей.
Бесплатный курс по PHP программированию
Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC
В курсе 39 уроков | 15 часов видео | исходники для каждого урока
Хотите изучить регулярные выражения на PHP?
Посмотрите 12-ти часовой видео курс по регулярным выражениям на PHP!
Визуальный генератор регулярных выражений
Все разработчики рано или поздно сталкиваются с регулярными выражениями. Практически в 100% случаев нам совершенно не нравится их составлять, считая это побочной работой, не связанной с программированием.
Большинство из нас, впервые столкнувшись с данной проблемой, начинают забивать в поисковых системах что-то типа: «regexp online generator» и к своему великому сожалению осознают что гугл сломался все результаты в поиске являются сервисами для проверки корректности уже составленного регулярного выражения (или я плохо гуглил).
А как же составить это самое регулярное выражение?
До недавнего времени существовало 2 ответа на этот вопрос:
История
Давным давно, в одном проекте пришел довольно интересный и сложный запрос от внутренних пользователей. Персоналу технической поддержки нужно было самим задавать правила валидации для определенных полей, разным пользователям. Правила должны были часто и очень оперативно изменяться.
Как и любой хороший разработчик, ваш покорный слуга естественно начал с поиска уже готовых решений. Ничего подходящего не нашлось и пришлось приступить к очень примитивной реализации. На сложную, как обычно, не было ни средств ни времени.
Но эта проблема его очень сильно зацепила и вот теперь, наконец, он рад представить вам плоды своих трудов.
Начнем
Для начала решил сделать веб-сервис. Хотелось сделать максимально просто (для более широкого круга людей), чтобы своё правило для валидации смогли составить не только программисты, но и люди которые далеки от программирования (модераторы/администраторы).
Как и ожидалось, новому пользователю вообще ничего непонятно и поэтому пришлось разработать вводный интерактивный курс:
Всегда выступаю против модальных окон и попапов, но в этом случае мне кажется их все же целособразно использовать. Можно назвать это «приветственным сообщением».
А вот и сам интерактивный курс, точнее его часть:
Также вы можете включить отображение отдельных подсказок вне зависимости пройдете ли вы вводный курс, либо откажитесь от него.
А что же насчет функционала?
Первое что бросается в глаза — это «Примеры» и сделано это неспроста. Для начала, я настоятельно рекоммендую выбрать наиболее близкий для вашей задачи пример. Вы можете просто переключиться между некорректным и корректным вариантом для более простого понимания примеров. Затем можете изменить выбранный вами пример так, как сами пожелаете. Со временем список примеров будет расширяться:
Далее идет то, ради чего это всё и затевалось — сгенерированное Регулярное Выражение:
Здесь хотелось бы немного остановиться и рассказать подробнее.
С самого начала мне хотелось создать инструмент не ограничивающий пользователей в создании многосложных регулярок и в то же время сделать интерфейс максимально простым. А на деле, сколько раз кардинально изменялся интерфейс я уже и со счета сбился. Также пришлось несколько раз переписывать часть логики самого генератора (ядро). И не потому что архитектура была плохо продумана, а из-за того что некоторые варианты просто не были учтены. А вариантов — огромное множество.
Еще хотелось бы рассказать о возможностях. На данный момент можно создавать регулярку с группами/подгруппами, определять опциональные части (не обязательные), указывать конкретные символы (у остальных будет определяться тип), указать тип — «любой символ» и блокировать определенные символы в конкретной части регулярки. Вы можете довольно просто создать регулярку не только для слова, но и для словосочетания и даже предложения. Доступна генерация регулярок как на латинице и так на кириллице (по отдельности и вместе). По мере добавления дополнительных локализаций интерфейса, планируется поддержка регулярок и для других письменностей.
Кстати, не пугайтесь что регулярное выражение всегда красного цвета. Это не символизирует ошибку, а сделано лишь для того, чтобы акцентировать ваше внимание на этой крайне важной информации.
Далее по порядку идет «Тестовое поле»
Здесь происходит проверка введенного тестового значения на соответствие сгенерированному регулярному выражению. И происходит она «на лету». Ничего нажимать не нужно. Тем самым вы можете гораздо быстрее и удобнее проверить множество вариантов.
Под полем ввода отображается описание автоматически сгенерированного правила.
Есть вариант с описанием правила в виде ошибки, когда введенное тестовое значение не соответствует сгенерированному правилу/регулярке:
На данном примере видно как срабатывает проверка на заблокированные символы:
Также есть вариант с описанием правила в отдельном блоке, когда введенное тестовое значение соответствует сгенерированному правилу/регулярке:
Хотелось бы разъяснить значение цветов с частями правила:
Ядро (UI)
Вот и наконец мы добрались до последнего блока по порядку, но не по значению. Я лично считаю этот блок — ядром всего сервиса. Именно здесь Генератор получает все необходимые входные данные, которые впоследствии обрабатывает и выдает уже готовый результат. Кстати, вся логика реализована только на клиенте. Веб сервис вообще не имеет серверного кода.
Вначале крайне важно понять что машина не умеет читать мысли должна получить хоть какую-то информацию, чтобы проанализировать ее и выдать хоть какой-то результат. Чем правильней и лаконичнее будут примеры, тем правильней и лаконичнее будет результат. Порядок примеров абсолютно ни на что не влияет.
Здесь можно очень долго и нудно рассказывать что и как нужно вводить, но мне кажется это будет намного проще понять с помощью примеров, которых там довольно много. И вообще, материала с описанием как и что работает хватит еще на одну большую статью.
А ты не забыл сохраниться?
После того, как мы нажали кнопку «Генерировать», у нас сгенерировалось регулярное выражение. Теперь мы можем сохранить его. На всякий случай хочу уточнить что сохраняется оно только в памяти браузера (localstorage).
При нажатии на кнопку «Сохранить» появляется диалоговое окно:
Вы можете вручную ввести описание для правила или переключиться на автоматическое описание как в примере ниже. Также вам нужно ввести название для правила:
Этот функционал был разработан с расчетом на будущий плагин, но пригодился и в данном веб-сервисе.
На самом деле, как в случае с примерами так и с пользовательскими правилами, сохраняется не сгенерированное правило, а просто входные данные и каждый раз когда вы переключаете правило — срабатывает логика генератора. Это очень удобно при исправлении багов в логике самого генератора. Тем самым даже сохраненные правила будут работать с последней версией уже исправленного генератора.
Дополнительные возможности
Я расположил их по приоритету:
Технологии
Вот основной стек технологий с помощью которого удалось всё это реализовать:
Заключение
В дальнейших планах — сделать полноценный плагин, который позволит задавать правила валидации одновременно для клиента и для сервера прямо из интерфейса. Мне кажется это окажется очень удобным и практичным решением. Затем можно развить эту идею и создать даже «Visual Form Builder» на основе как-бы стандарта: «JSON Schema», с которым мне пришлось поработать в свое время.
Если вы захотите сделать что-то аналогичное, я буду только за и даже помогу советами. Считаю что: «Сама идея практически ничего не стоит, стоит ее непосредственная реализация».
Регулярные выражения в PHP.
Регулярные выражения позволяют найти в строке последовательности, соответствующие шаблону. Например шаблон «Вася(.*)Пупкин» позволит найти последовательность когда между словами Вася и Пупкин будет любое количество любых символов. Если надо найти шесть цифр, то пишем «2<6>» (если, например, от шести до восьми цифр, тогда «5<6,8>«). Здесь разделены такие вещи как указатель набора символов и указатель необходимого количества:
Как всякий гибкий инструмент, регулярные выражения гибки, но не абсолютно: зона их применения ограничена. Например, если вам надо заменить в тексте одну фиксированную строку на другую, фиксированную опять же, пользуйтесь str_replace. Разработчики php слезно умоляют не пользоваться ради этого сложными функциями ereg_replace или preg_replace, ведь при их вызове происходит процесс интерпретации строки, а это серьезно потребляет ресурсы системы. К сожалению, это любимые грабли начинающих php-программистов.
Набор символов
Не пользуйтесь классом символов для обозначения всего лишь одного (вместо «[ ]+» вполне сойдет » +»). Не пишите в классе символов точку это ведь любой символ, тогда другие символы в классе будут просто лишними (а в негативном классе получится отрицание всех символов).
Квантификатор
Квантификатором можно указать как конкретное значение, так и пределы. Если число заданных подпадает под пределы квантификатора, фрагмент выражения считается совпавшим с разбираемой строкой. Синтаксис:
Если нужно указать только необходимый минимум, а максимума нет, просто ставим запятую и не пишем второе число: «<5,>» («минимум 5»). Для наиболее часто употребляемых квантификаторов есть специальные обозначения:
| * | «звёздочка» или знак умножения |
| + | плюс |
| ? | вопросительный знак |
На практике такие символы используются чаще, чем фигурные скобки.
Якоря
Эти символы должны стоять соответственно в самом начале и в самом конце строки.
Жадность
Вопросительный знак выступает еще и как минимизатор квантификатора:
.*?
Результат работы примера:
Строка шаблона, как вы уже заметили, начинается и заканчивается слэшами. После второго идут параметры:
| i | регистронезависимый поиск |
| m | |
| s | символ «.» (точка) совпадает и с переносом строки (по умолчанию нет) |
| A | привязка к началу текста |
| E | заставляет символ «$» совпадать только с концом текста. Игнорируется, если установлен парамерт m. |
| U | Инвертирует «жадность» для каждого квантификатора (если же после квантификатора стоит «?», этот квантификатор перестает быть «жадным»). |
| e | Строка замены интерпретитуется как PHP код. |
Функции для работы с регулярными выражениями
preg_grep
array preg_grep (string pattern, array input [, int flags])
preg_grep() возвращает массив, состоящий из элементов входящего массива input, которые соответствуют заданному шаблону pattern.
Параметр flags может принимать следующие значения:
PREG_GREP_INVERT
В случае, если этот флаг установлен, функция preg_grep(), возвращает те элементы массива, которые не соответствуют заданному шаблону pattern.
Результат, возвращаемый функцией preg_grep() использует те же индексы, что и массив исходных данных. Если такое поведение вам не подходит, примените array_values() к массиву, возвращаемому preg_grep() для реиндексации.
Пример кода:
preg_match
int preg_match ( string pattern, string subject [, array matches [, int flags [, int offset]]]) Ищет в заданном тексте subject совпадения с шаблоном pattern
flags может принимать следующие значения:
Функция preg_match() возвращает количество найденных соответствий. Это может быть 0 (совпадения не найдены) и 1, поскольку preg_match() прекращает свою работу после первого найденного совпадения. Если необходимо найти либо сосчитать все совпадения, следует воспользоваться функцией preg_match_all(). Функция preg_match() возвращает FALSE в случае, если во время выполнения возникли какие-либо ошибки.
Рекомендация: Не используйте функцию preg_match(), если необходимо проверить наличие подстроки в заданной строке. Используйте для этого strpos() либо strstr(), поскольку они выполнят эту задачу гораздо быстрее.
Пример кода
Пример кода
Пример кода
preg_match_all
int preg_match_all (string pattern, string subject, array matches [, int flags [, int offset]])
Ищет в строке subject все совпадения с шаблоном pattern и помещает результат в массив matches в порядке, определяемом комбинацией флагов flags.
После нахождения первого соответствия последующие поиски будут осуществляться не с начала строки, а от конца последнего найденного вхождения.
Дополнительный параметр flags может комбинировать следующие значения (необходимо понимать, что использование PREG_PATTERN_ORDER одновременно с PREG_SET_ORDER бессмысленно):
Пример кода
Пример кода
В случае, если никакой флаг не используется, по умолчанию используется PREG_PATTERN_ORDER.
Возвращает количество найденных вхождений шаблона (может быть нулем) либо FALSE, если во время выполнения возникли какие-либо ошибки.
Пример кода
Пример кода
preg_quote
string preg_quote (string str [, string delimiter])
Функция preg_quote() принимает строку str и добавляет обратный слеш перед каждым служебным символом. Это бывает полезно, если в составлении шаблона участвуют строковые переменные, значение которых в процессе работы скрипта может меняться.
В случае, если дополнительный параметр delimiter указан, он будет также экранироваться. Это удобно для экранирования ограничителя, который используется в PCRE функциях. Наиболее распространенным ограничителем является символ ‘/’.
Пример кода
Пример кода
preg_replace
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])
При использовании замены по шаблону с использованием ссылок на подмаски может возникнуть ситуация, когда непосредственно за маской следует цифра. В таком случае нотация вида \\n приводит к ошибке: ссылка на первую подмаску, за которой следует цифра 1, запишется как \\11, что будет интерпретировано как ссылка на одиннадцатую подмаску. Это недоразумение можно устранить, если воспользоваться конструкцией \$<1>1, указывающей на изолированную ссылку на первую подмаску, и следующую за ней цифру 1.
Результатом работы этого примера будет:
Если во время выполнения функции были обнаружены совпадения с шаблоном, будет возвращено измененное значение subject, в противном случае будет возвращен исходный текст subject.
Первые три параметра функции preg_replace() могут быть одномерными массивами. В случае, если массив использует ключи, при обработке массива они будут взяты в том порядке, в котором они расположены в массиве. Указание ключей в массиве для pattern и replacement не является обязательным. Если вы все же решили использовать индексы, для сопоставления шаблонов и строк, участвующих в замене, используйте функцию ksort() для каждого из массивов.
В случае, если параметр subject является массивом, поиск и замена по шаблону производятся для каждого из его элементов. Возвращаемый результат также будет массивом.
Модификатор /e меняет поведение функции preg_replace() таким образом, что параметр replacement после выполнения необходимых подстановок интерпретируется как PHP-код и только после этого используется для замены. Используя данный модификатор, будьте внимательны: параметр replacement должен содержать корректный PHP-код, в противном случае в строке, содержащей вызов функции preg_replace(), возникнет ошибка синтаксиса.
Пример кода: Замена по нескольким шаблонам
Этот пример выведет:
Пример кода: Использование модификатора /e
Пример кода: Преобразует все HTML-теги к верхнему регистру
preg_replace_callback
mixed preg_replace_callback (mixed pattern, callback callback, mixed subject [, int limit])
Пример кода
preg_split
array preg_split (string pattern, string subject [, int limit [, int flags]])
Возвращает массив, состоящий из подстрок заданной строки subject, которая разбита по границам, соответствующим шаблону pattern.
flags может быть произвольной комбинацией следующих флагов (соединение происходит при помощи оператора ‘|’):
PREG_SPLIT_NO_EMPTY
В случае, если этот флаг указан, функция preg_split() вернет только непустые подстроки.
PREG_SPLIT_DELIM_CAPTURE
В случае, если этот флаг указан, выражение, заключенное в круглые скобки в разделяющем шаблоне, также извлекается из заданной строки и возвращается функцией. Этот флаг был добавлен в PHP 4.0.5.
Примеры кода
В случае, если после открывающей круглой скобки следует «?:«, захват строки не происходит, и текущая подмаска не нумеруется. Например, если строка «the white queen» сопоставляется с шаблоном the ((?:red|white) (king|queen)), будут захвачены подстроки «white queen» и «queen», и они будут пронумерованы 1 и 2 соответственно:



















