Уроки 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 скриптах.