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