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

Бурное развитие Веба и языков 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 постоянные подшаблоны выделяются круглыми скобками и время от времени именуются «подвыражениями». Делают последующие функции:

  1. Выделение альтернатив. К примеру, шаблон жар(кое|птица|) совпадет со словами «жар», «жар-птица» и «жаркое». А без скобок это будет только пустая строчка, «птица» и «жаркое».

  2. «Захватывающий» подшаблон. Это значит, что если в шаблоне совпала подстрока, то в качестве результата ворачиваются все совпадения. Для наглядности приведем пример. Дано последующее постоянное выражение: фаворит получает((золотую|позолоченный)(медаль|кубок)) — и строчка для поиска совпадений: «фаворит получает золотую медаль». Не считая начальной фразы, в поисковом результате будут выданы: «золотую медаль», «медаль», «золотую».

Операторы повторений (квадрификаторы)

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

Для описания повторений используются квадрификаторы – метасимволы для задания количества. Квадрификаторы бывают 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, должно инспектировать последующие условия:

  1. Наличие в начальной строке знака @ и отсутствие пробелов.
  2. Доменная часть адреса, за эмблемой @, содержит только допустимые знаки для доменных имен. То же относится и к имени юзера.
  3. При проверке имени юзера нужно найти наличие особых знаков, таких как апостроф либо вертикальная черта. Такие знаки относятся к потенциально небезопасным и могут содержаться в таких видах нападений, как SQL-инъекции. Опасайтесь таких адресов.
  4. Имена юзера допускают наличие только одной точки, которая не может быть первым либо последним эмблемой в строке.
  5. Доменное имя должно содержать не меньше 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. Постоянное выражение, написанное и испытанное лично, увеличивает квалификацию и гарантирует отсутствие ошибок.