Уроки PHP – регулярні вирази з прикладами
У сьогоднішній статті ми розглянемо регулярні вирази в PHP, а також побачимо практичні приклади використання регулярних виразів в PHP скриптах.
Основи регулярних виразів в PHP
На самому початку появи регулярних виразів на них було покладено завдання допомоги при роботі з рядками в Unix системах. Пізніше вони стали активно використовуватися не тільки в інших системах, але й в різних мовах програмування.
У PHP регулярні вирази використовуються для синтаксичного аналізу тексту відповідно до визначеного шаблону. Використовуючи регулярні вирази, ви можете легко знайти за шаблоном потрібний текст в рядку, і замінити його, якщо потрібно, або просто зробити перевірку на наявність такого тексту.
Типи регулярних виразів
Існує 2 типи регулярних виразів:
- Perl сумісний
- POSIX розширений
Perl сумісні функції – це такі як preg_match
, preg_replace
, а версії POSIX – такі як ereg
, eregi
. Зауважте, що останні функції вважаються застарілими в PHP 5.3.0 і були видалені в PHP 7. Тому ми будемо використовувати тільки Perl сумісні функції. Важливо знати, що при використанні Perl-сумісних регулярних виразів, такий вираз має бути укладений в роздільники, наприклад, косу риску (/
).
Основний синтаксис регулярних виразів в PHP
Щоб використовувати регулярні вирази, спочатку вам потрібно вивчити синтаксис шаблонів. Ми можемо згрупувати символи всередині шаблону наступним чином:
- Звичайні символи, які слідують один за другим, наприклад,
hello
- Індикатори початку і закінчення рядка у вигляді
^
і$
- Індикатори підрахунку, такі як
+
,*
,?
- Логічні оператори, такі як
|
- Групуючі оператори, такі як
{}
,()
,[]
Приклад шаблону регулярного виразу для перевірки правильності адреси електронної скриньки виглядає наступним чином:
^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$
Код PHP для перевірки електронної пошти з використанням Perl-сумісного регулярного виразу виглядає наступним чином:
<?php $pattern = "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/"; $email = "some-email@test.com"; if (preg_match($pattern, $email)) { echo "Перевірка пройдена успішно!"; } else { echo "Перевірка не пройдена!"; } ?>
Тепер давайте подивимося на докладний розбір синтаксису шаблону при регулярному виразі:
Регулярний вираз (шаблон) | Проходить перевірку (об’єкт) | Не проходить перевірку (об’єкт) | Коментар |
world |
Hello world | Hello Ivan | Проходить, якщо шаблон присутній деінде в об’єкті |
^world |
world class | Hello world | Проходить, якщо шаблон присутній на початку об’єкта |
world$ |
Hello world | world class | Проходить, якщо шаблон присутній в кінці об’єкта |
world/i |
This WoRLd | Hello Ivan | Виконує пошук в нечутливому до регістру режимі |
^world$ |
world | Hello world | Рядок містить лише “world” |
world* |
worl, world, worlddd | wor | Присутньо 0 або більше “d” після “worl” |
world+ |
world, worlddd | worl | Присутня принаймні одна “d” після “worl” |
world? |
worl, world, worly | wor, wory | Присутньо 0 або 1 “d” після “worl” |
world{1} |
world | worly | Присутня одна “d” після “worl” |
world{1,} |
world, worlddd | worly | Присутня одна або більше “d” після “worl” |
world{2,3} |
worldd, worlddd | world | Присутньо 2 або 3 “d” після “worl” |
wo(rld)* |
wo, world, worldold | wa | Присутньо 0 або більше “rld” після “wo” |
earth|world |
earth, world | sun | Рядок містить «earth» або “world” |
w.rld |
world, wwrld | wrld | Містить будь-який символ замість крапки |
^.{5}$ |
world, earth | sun | Рядок містить рівно 5 символів |
[abc] |
abc, bbaccc | sun | У рядку є “a”, або “b”, або “c” |
[a-z] |
world | WORLD | У рядку є будь-які малі літери |
[a-zA-Z] |
world, WORLD, Worl12 | 123 | У рядку є будь-які малі або прописні букви |
[^wW] |
earth | w, W | Фактичний символ не може бути “w” або “W” |
Тепер перейдемо до більш складного регулярного виразу з докладним поясненням.
Практичні приклади складних регулярних виразів
Тепер, коли ви знаєте теорію і основний синтаксис регулярних виразів в PHP, прийшов час створити і проаналізувати деякі більш складні приклади.
1) Перевірка імені користувача за допомогою регулярного виразу
Почнемо з перевірки імені користувача. Якщо у вас є форма реєстрації, вам знадобиться перевіряти на правильність імена користувачів. Припустімо, ви не хочете, щоб в імені були які-небудь спеціальні символи, крім “_.-
” і, звичайно, ім’я повинно містити букви і можливо цифри. Крім того, вам може знадобитися контролювати довжину імені користувача, наприклад від 4 до 20 символів.
Спочатку нам потрібно визначити доступні символи. Це можна реалізувати за допомогою наступного коду:
[a-zA-Z0-9_.-]
Після цього нам потрібно обмежити кількість символів наступним кодом:
{4,20}
Тепер збираємо цей регулярний вираз разом:
^[a-zA-Z-0-9_.-]{4,20}$
У разі Perl-сумісного регулярного виразу огорніть його символами ‘/
‘. Підсумковий PHP-код має такий вигляд:
<?php $pattern = '/^[a-zA-Z0-9_.-]{4,20}$/'; $username = "demo_user-123"; if (preg_match($pattern, $username)) { echo "Перевірка пройдена успішно!"; } else { echo "Перевірка не пройдена!"; } ?>
2) Перевірка шістнадцятирічного коду кольору регулярним виразом
Шістнадцятковий код кольору має такий вигляд: #5A332C
, також можна використовувати спеціальну коротку форму, наприклад #C5F
. В обох випадках код кольору розпочинається з #
і потім йдуть рівно 3 або 6 цифр або букв від a до f.
Отже, перевіряємо початок коду:
^#
Потім перевіряємо діапазон допустимих символів:
[a-fA-F0-9]
Після цього перевіряємо допустиму довжину коду (вона може бути або 3, або 6). Повний код регулярного виразу вийде наступним:
^#(([a-fA-F0-9]{3}$)|([a-fA-F0-9]{6}$))
Тут ми використовуємо логічний оператор, щоб спочатку перевірити код виду #123
, а потім код виду #123456
. Підсумковий PHP-код перевірки регулярним виразом виглядає так:
<?php $pattern = '/^#(([a-fA-F0-9]{3}$)|([a-fA-F0-9]{6}$))/'; $color = "#1AA"; if (preg_match($pattern, $color)) { echo "Перевірка пройдена успішно!"; } else { echo "Перевірка не пройдена!"; } ?>
3) Перевірка електронної пошти клієнта з використанням регулярного виразу
Тепер давайте подивимося, як ми можемо перевірити адресу електронної пошти за допомогою регулярних виразів. Спочатку уважно розгляньте наступні приклади адрес пошти:
john.doe@test.com john@demo.ua john_123.doe@test.info
Як ми можемо бачити, символ @
є обов’язковим елементом в адресі електронної пошти. Крім цього повинен бути якийсь набір символів до і після цього елемента. Точніше, після нього має йти допустиме доменне ім’я.
Таким чином, перша частина повинна бути рядком з буквами, цифрами або деякими спеціальними символами, такими як _- .
. В шаблоні ми можемо написати це в такий спосіб:
^[a-zA-Z0-9_.-]+
Доменне ім’я завжди має, скажімо, ім’я та tld (top-level domain) – тобто, доменну зону. Доменна зона – це .com
, .ua
, .info
тощо. Це означає, що шаблон регулярного виразу для домену буде виглядати так:
[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$
Тепер, якщо ми зберемо все до купи, то отримаємо повний шаблон регулярного виразу для перевірки адреси електронної пошти:
^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$
У коді PHP ця перевірка буде виглядати наступним чином:
<?php $pattern = '/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/'; $email = "john_123.doe@test.info"; if (preg_match($pattern, $email)) { echo "Перевірка пройдена успішно!"; } else { echo "Перевірка не пройдена!"; } ?>
Сподіваємося, що сьогоднішня стаття допомогла вам при знайомстві з регулярними виразами в PHP, а практичні приклади знадобляться вам при використанні регулярних виразів у власних PHP скриптах.