PHP (регулярний вираз) - що це таке? Приклади і перевірка регулярних виразів
При роботі з текстами в будь-якому сучасному мові програмування розробники постійно зустрічаються із завданнями перевірки введених даних на відповідність потрібного шаблону, пошуку і заміни тестових фрагментів та іншими типовими операціями з обробки символьної інформації. Розробка власних алгоритмів перевірки призводить до втрати часу, несумісності програмного коду і складності в його розвитку та модернізації.
Бурхливий розвиток Інтернету та мов WEB-розробки зажадало створення універсальних і компактних засобів обробки текстової інформації при мінімальній кількості необхідного для цього коду. Не є винятком і популярний серед початківців та професійних розробників мова PHP. Регулярний вираз як мова текстових шаблонів дозволяє спростити завдання обробки тексту і зменшити програмний код на десятки і сотні рядків. Багато задач взагалі неможливо вирішити без нього.
Регулярні вирази в 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,5}. Якщо максимальна кількість повторень невідомо, другий аргумент не вказується: х {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-ін`єкції. Уникайте таких адрес.
- Імена користувача допускають наявність тільки однієї точки, яка не може бути першим або останнім символом в рядку.
- Доменне ім`я повинне містити не менше двох і не більше шести символів.
Приклад, що враховує всі зазначені умови, можна побачити далі на малюнку.
Перевірка правильності адрес URL
Задача. Перевірити, чи є задана текстовий рядок допустимим адресою URL. Ще раз відзначимо, що регулярні вирази URL-перевірки можуть бути реалізовані різними способами.
Рішення. Наш підсумковий варіант виглядає наступним чином:
/^(https?://)?([da-z.-]+).([az.]{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]?) $ |
Пошук IP-адреси
Задача. Необхідно визначити, чи є заданий рядок допустимим IP-адресою у форматі IPv4 в діапазоні від 000.000.000.000-255.255.255.255.
Рішення. Як і в будь-якій задачі на мові PHP, регулярний вираз має безліч варінт. Наприклад, таке:
Онлайн-перевірка виразів
Перевірка регулярних виразів на правильність для початківців програмістів може бути скрутною через складність синтаксису, що відрізняється від «звичайних» мов програмування. Для вирішення даної проблеми існує безліч онлайн-тестерів виразів, що дозволяють легко перевірити правильність створеного шаблону на реальному тексті. Програміст вводить вираз і дані для перевірки і миттєво бачить результат обробки. Зазвичай тут же присутній довідковий розділ, де докладно описуються регулярні вирази, приклади та відзнаки реалізації для найбільш поширених мов програмування.
Але повністю довіряти результатам онлайн-сервісів не рекомендується всім розробникам, які користуються PHP. Регулярний вираз, написаний і перевірений особисто, підвищує кваліфікацію і гарантує відсутність помилок.