PHP (регулярное выражение) — что это такое? Примеры и проверка регулярных выражений
При работе с текстами в любом современном языке программирования разработчики повсевременно встречаются с задачками проверки введенных данных на соответствие подходящему шаблону, поиска и подмены тестовых фрагментов и иными типовыми операциями по обработке символьной инфы. Разработка собственных алгоритмов проверки приводит к потере времени, несовместимости программного кода и трудности в его развитии и модернизации.
Бурное развитие Веба и языков WEB-разработки потребовало сотворения универсальных и малогабаритных средств обработки текстовой инфы при наименьшем количестве требуемого для этого кода. Не является исключением и пользующийся популярностью посреди начинающих и проф разработчиков язык PHP. Постоянное выражение как язык текстовых шаблонов позволяет упростить задачки обработки текста и уменьшить программный код на 10-ки и сотки строк. Многие задачки вообщем нереально решить без него.
Постоянные выражения в PHP
Язык PHP содержит три принципа работы с постоянными выражениями — «ereg», «mb_ereg» и «preg». Более всераспространенным является интерфейс «preg», функции которого обеспечивают доступ к библиотеке поддержки постоянных выражений PCRE, вначале разработанной для языка Perl, которая заходит в набор PHP. Preg-функции отыскивают в данной текстовой строке совпадения, согласно определенному шаблону на языке постоянных выражений.
Базы синтаксиса
В рамках недлинной статьи нереально тщательно обрисовать весь синтаксис постоянных выражений, для этого существует особая литература. Приведем только главные элементы для показа широких способностей для разработчика и осознания примеров кода.
В PHP постоянное выражение формально определяется очень трудно, и потому упростим описание. Постоянное выражение представляет собой текстовую строчку. Она состоит из выделенного разделителем шаблона и модификатора, указывающего на то, каким образом его обрабатывать. Может быть включение в шаблоны разных альтернатив и повторений.
К примеру, в выражении /d{3}-d{2}-d{2}/m разделителем будет «/», дальше идет шаблон, а знак «m» будет модификатором.
Вся мощь постоянных выражений кодируется при помощи метасимволов. Главным метасимволом языка является оборотный слэш — «». Он меняет тип последующего за ним знака на обратный (т. е. обыденный знак преобразуется в метасимвол и напротив). Другим принципиальным метасимволом является ровная черта «|», задающая другие варианты шаблона. Еще примеры метасимволов:
^ | Начало объекта либо строчки |
( | Начало подшаблона |
) | Окончание подшаблона |
{ | Начало квантификатора |
} | Конец квантификатора |
d | десятичная цифра от 0 до 9 |
D | хоть какой знак, не являющийся цифрой |
s | пустой знак, пробел, табуляция |
w | словарный знак |
PHP, обрабатывая постоянные выражения, пробел рассматривает как отдельный весомый знак, потому выражения АБВГДЕ и АБВ ГДЕ являются различными.
Подшаблоны
В PHP постоянные подшаблоны выделяются круглыми скобками и время от времени именуются «подвыражениями». Делают последующие функции:
-
Выделение альтернатив. К примеру, шаблон жар(кое|птица|) совпадет со словами «жар», «жар-птица» и «жаркое». А без скобок это будет только пустая строчка, «птица» и «жаркое».
-
«Захватывающий» подшаблон. Это значит, что если в шаблоне совпала подстрока, то в качестве результата ворачиваются все совпадения. Для наглядности приведем пример. Дано последующее постоянное выражение: фаворит получает((золотую|позолоченный)(медаль|кубок)) — и строчка для поиска совпадений: «фаворит получает золотую медаль». Не считая начальной фразы, в поисковом результате будут выданы: «золотую медаль», «медаль», «золотую».
Операторы повторений (квадрификаторы)
При составлении постоянных выражений очень нередко нужно рассматривать повторения чисел и знаков. Это не является неувязкой, если повторений не сильно много. Но что делать, когда мы не знаем их четкого числа? В таком случае нужно использовать особые метасимволы.
Для описания повторений используются квадрификаторы – метасимволы для задания количества. Квадрификаторы бывают 2-ух типов:
- общие, заключенные в скобки;
- сокращенные.
Общий квантификатор задет малое и наибольшее количество разрешенных повторений элемента в виде 2-ух чисел в фигурных скобках, к примеру так: х{2,5}. Если наибольшее количество повторений непонятно, 2-ой аргумент не указывается: х{2,}.
Сокращенные квантификаторы представляют собой знаки для более всераспространенных повторений во избежание излишней перегрузки синтаксиса. Обычно употребляются три сокращения:
1. * — ноль и больше повторений, что эквивалентно {0,}.
2. + — одно и поболее повторений, т. е. {1,}.
3. ? – ноль либо только одно повторение — {0,1}.
Примеры постоянных выражений
Для тех, кто изучает постоянные выражения, примеры — наилучший учебник. Мы приведем несколько, которые демонстрируют их широкие способности при минимуме усилий. Все программные коды на сто процентов совместимы с версиями PHP 4.x и выше. Для полного осознания синтаксиса и использования всех способностей языка советуем книжку Дж. Фридла «Постоянные выражения», где вполне рассматривается синтаксис и имеются примеры постоянных выражений не только лишь на PHP, да и для языков Python, Perl, MySQL, Java, Ruby и C#.
Проверка правильности адреса E-mail
Задачка. Существует Веб-страница, на которой у гостя запрашивается адресок email. Постоянное выражение должно инспектировать корректность приобретенного адреса перед отправкой сообщений. Проверка не дает гарантии, что обозначенный почтовый ящик реально существует и воспринимает письма. Но отсеять заранее некорректные адреса она может.
Решение. Как и в любом языке программирования, на PHP постоянные выражения email-проверки адреса могут быть реализованы различными методами, и примеры в этой статье не являются окончательным и единственным вариантом. Потому в каждом случае мы будем приводить список требований, которые необходимо учитывать при программировании, а определенная реализация вполне находится в зависимости от разработчика.
Итак, выражение, проверяющее корректность email, должно инспектировать последующие условия:
- Наличие в начальной строке знака @ и отсутствие пробелов.
- Доменная часть адреса, за эмблемой @, содержит только допустимые знаки для доменных имен. То же относится и к имени юзера.
- При проверке имени юзера нужно найти наличие особых знаков, таких как апостроф либо вертикальная черта. Такие знаки относятся к потенциально небезопасным и могут содержаться в таких видах нападений, как SQL-инъекции. Опасайтесь таких адресов.
- Имена юзера допускают наличие только одной точки, которая не может быть первым либо последним эмблемой в строке.
- Доменное имя должно содержать не меньше 2-ух и менее 6 знаков.
Пример, учитывающий все обозначенные условия, можно узреть дальше на рисунке.
Проверка корректности адресов URL
Задачка. Проверить, является ли данная текстовая строчка допустимым адресом URL. Снова отметим, что постоянные выражения URL-проверки могут быть реализованы разными методами.
Решение. Наш итоговый вариант смотрится последующим образом:
/^(https?://)?([da-z.-]+).([a-z.]{2,6})([/w .-]*)*/?$/
Сейчас разберем его составляющие более тщательно, используя набросок.
п.1 | Перед адресом URL не должно быть никаких знаков |
п.2 | Проверяем наличие неотклонимого префикса «http» |
п.3 | Не должно быть знаков |
п.4 | Если находится «s», то URL показывает на защищенное соединение «https» |
п.5 | Неотклонимый кусок «//» |
п.6 | Нет знаков |
п. 7-9 | Проверка корректности домена первого уровня и наличия точки |
п.10-13 | Контроль корректности написания домена второго уровня и точки |
п.14-17 |
Файловая структура URL — набор цифр, букв, подчёркиваний, дефисов, точек и слэш в конце |
Проверяем номера кредитных карт
Задачка. Нужно воплотить проверку корректности введенного номера пластмассовой карты более всераспространенных платежных систем. Рассмотрен вариант только для карт Visa и MasterCard.
Решение. При разработке выражения нужно учесть вероятное наличие во введенном номере пробелов. Числа номера на карте разбиты на группы для упрощения чтения и диктовки. Потому полностью естественно, что человек может попробовать ввести номер таким макаром (т. е. используя пробелы).
Написать универсальное выражение, учитывающее вероятные пробелы и дефисы, труднее, чем просто откинуть все знаки, не считая цифр. Потому в выражении рекомендуется использовать метасимвол /D, который удаляет все знаки, не считая цифр.
Сейчас можно перебегать конкретно к проверке номера. Все компании, выпускающие кредитные карты, употребляют уникальный формат номера. В примере это употребляется, и клиенту нет необходимости вводить наименование компании – она определяется по номеру. Карты Visa всегда начинаются с 4 и имеют длину номера в 13 либо 16 цифр. MasterCard начинается в спектре 51-55 с длиной номера 16. В конечном итоге получаем такое выражение:
Перед обработкой заказа можно провести дополнительную проверку последней числа номера, которая рассчитывается по методу Луна.
Проверка телефонных номеров
Задачка. Проверка правильности введенного телефонного номера.
Решение. Количество цифр в стационарных и мобильных телефонных номерах существенно различается зависимо от страны, потому универсально проверить, используя постоянные выражения, номер телефона на корректность нереально. Но международные номера имеют серьезный формат и отлично подходят для проверки по шаблону. Тем паче что больше государственных телефонных операторов стараются соответствовать одному эталону. Структура номера последующая:
+CCC.NNNNNNNNNNxEEEE, где:
— C – это код страны, состоящий из 1-3 цифр.
— N – номер длиной до 14 числа.
— E – необязательное расширение.
Плюс является неотклонимым элементом, а символ х находится только по мере надобности расширения.
В итоге имеем последующее выражение:
^+[0-9]{1,3}.[0-9]{4,14}(?:x.+)?$
Числа в спектре
Задачка. Нужно обеспечить совпадение целого числа из определенного спектра. Дополнительно нужно, чтоб находили постоянные выражения только числа из спектра значений.
Решение. Приведем несколько выражений для нескольких более всераспространенных случаев:
Определяем час от 1 до 24 | ^(1[0-2]|[1-9])$ |
Денек снутри месяца 1-31 | ^(3[01]|[12][0-9]|[1-9])$ |
Секунда либо минутка 0-59 | ^[1-5]?[0-9]$ |
Число от 1 до 100 | ^(100|[1-9]?[0-9])$ |
Денек года 1-366 | ^(36[0-6]|3[0-5][0-9]|[12][0-9]{2}|[1-9][0-9]?)$ |
Поиск Айпишники
Задачка. Нужно найти, является ли данная строчка допустимым Айпишником в формате IPv4 в спектре от 000.000.000.000-255.255.255.255.
Решение. Как и в хоть какой задачке на языке PHP, постоянное выражение имеет огромное количество варинтов. К примеру, такое:
Онлайн-проверка выражений
Проверка постоянных выражений на корректность для начинающих программистов может быть затруднительной из-за трудности синтаксиса, отличающегося от «обыденных» языков программирования. Для решения данной трудности существует огромное количество онлайн-тестеров выражений, позволяющих просто проверить корректность сделанного шаблона на реальном тексте. Программер вводит выражение и данные для проверки и одномоментно лицезреет итог обработки. Обычно тут же находится справочный раздел, где тщательно описываются постоянные выражения, примеры и отличия реализации для более распостраненных языков программирования.
Но вполне доверять результатам онлайн-сервисов не рекомендуется всем разработчикам, пользующимся PHP. Постоянное выражение, написанное и испытанное лично, увеличивает квалификацию и гарантирует отсутствие ошибок.