😎 » PHP - FAQ » Основы PHP8 » Регулярні вирази PHP8. Приклади - розшифровка регулярки
178 0  

Регулярні вирази PHP8. Приклади - розшифровка регулярки

Регулярні вирази в PHP8 дають нам змогу вибрати по певній масці необхідні дані. ЩО доволяє легко сортувати, робити фільтр та здійснювати пошук по масці або регулярному виразу.

:winked: Приклади регулярок на практиці

Синтаксис шаблонів.

Ми можемо згрупувати символи всередині шаблону наступним чином:

  • Звичайні символи, які слідують один за другим, наприклад, hello
  • Індикатори початку і закінчення рядка у вигляді ^ і $
  • Індикатори підрахунку, такі як +, *, ?
  • Логічні оператори, такі як |
  • Групуючі оператори, такі як {}, (), []
//В нас є строка
"E:/OpenServer/0-upload/img/img-3885.webp"

$src = preg_replace("/(\/0-upload\/)/", '$1 . 222222', $src);

//..результат var_dump($src); :
/0-upload/ . 222222img/img-3885.webp

//Якщо потрібно в регулярку підставити значення змінної ($g_renm):
//Спочатку в регулярку вставляємо (%s):
$srcrr = preg_replace("/(.*)(\/0-upload\/img\/\d{4}\/\d{1,2}\/)(.*)(\.webp)/", "$1$2%s$4", $src);
//міняємо (%s) на свою змінну
$srcrr = sprintf($srcrr, $g_renm);

() - В дужках те що шукаємо

$1 - вставляє те що у перших дужках


Пояснення до знаків регулярних виразів:

Регулярний вираз (шаблон) Проходить перевірку (об’єкт) Не проходить перевірку (об’єкт) Коментар
(.{0,16}) Будь які символи від 0 до 16
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”

:love: При використанні екранування зворотним слешем деякі символи виконують спеціальну інтерпретацію:

\d - будь-яка десяткова цифра ([0-9]);

\D - будь-який символ, крім десяткової цифри;

\s - будь-який пробільний символ ([\r\n\t\f]);

\S - будь-який непробільний символ;

\w - будь-який символ, що утворює "слово" ([a-zA-Z0-9_]);

\W - будь-який символ, що не утворює "слово";

\t - символ табуляції;

\n - символ переводу рядка;

\\ - символ зворотного слешу (\);

\. - Символ крапки (.).

Символ крапки "." позначає будь-який символ у регулярному виразі крім символів розриву рядка "\r" або "\n", тому для пошуку крапки слід екранувати цей символ.

(.*?) - Символ ?, що стоїть у регулярному вираженні після іншого квантифікатора, переводить його в лінивий режим

Таблица 13.1. Метасимволы, распознаваемые ВНУТРИ квадратных скобок

Метасимвол

Значение

\

Переходный символ со множеством назначений

^

Отрицание класса, но только если это первый символ (например, «^\d» задает все, кроме цифр)

-

Задает диапазон символов (например, «0-9» задает все цифры, «A-Z» – все латинские буквы)

]

Вычисляет символьный класс

--

Таблица 13.2. Метасимволы, распознаваемые ВНЕ квадратных скобок

Метасимвол

Значение

\

Переходный символ со множеством назначений

^

Объявляет начало объекта (или строки в многострочном режиме). То есть этот символ определяет, что искомый текст должен находиться в начале строки. Альтернатива: «\A»

$

Объявляет конец объекта (или строки в многострочном режиме). То есть этот символ определяет, что искомый текст должен находиться в конце строки. Альтернативы: «\Z», «\z»

.

Совпадает с любым символом, кроме символа перевода строки (по умолчанию)

[

Начинает определение символьного класса

]

Заканчивает определение символьного класса

|

Разделяет перечисление альтернативных вариантов

(

Начинает подшаблон регулярное (подвыражение)

)

Заканчивает подшаблон

?

Расширяет значение «(», квантификаторов 0 или 1, и квантификатор минимизации

*

0 или больше повторений (квантификатор)

+

1 или больше повторений (квантификатор)

{

Начинает минимальный/максимальный квантификатор

}

Заканчивает минимальный/максимальный квантификатор


Як формується PHP регулярний вираз?

:love: Зразки регулярних виразів у PHP8:

// Перелік розширень
preg_match("/.tpl|.php|.css|.htm|.js/ui", $file);

// Усі латинські літера та усі цифри, тире, крапка, підкреслення з умовою від 2 до 22 знаків
preg_match("/^[a-z0-9-._]{2,22}$/ui", $grdel_file)

Приклад регулярки, ДЛЯ ЗРАЗКА - перевірка емейлу :

//ім`я має містити букви і можливо цифри довжиною від 5 до 25 символів.
//i - вкінці після слешу означає нечутливість до регістру
<?php
$pattern  = '/^[a-zA-Z0-9_.-]{5,25}$/i';
$username = "rullan_user-23";
if (preg_match($pattern, $username)) {
 echo "Перевірка пройдена успішно!";
} else {
 echo "Перевірка не пройдена!";
}
?>

//перевіряємо правильність введення емейлу:
<?php
$pattern = "/^[a-z0-9_\-\.]+@[a-z0-9_^\.]+\.[a-z]{1,6}$/ui";
$email   = "some-email@test.com";
if (preg_match($pattern, $email)) {
 echo "Перевірка пройдена успішно!";
} else {
 echo "Перевірка не пройдена!";
}
?>

Пояснення до перевірки емейлу:
^[a-z0-9_\-\.]+  - До символу собачки шаблон шукає букви та цифри, знак тире, нижнього підкреслення та крапки одне або більше число входжень починаючи з початку рядк

@[a-z0-9_^\.]+  - починаючи з собачки, маючи той же набір символів, що і перша частина:

\.[a-z]{1,6}$      - перевіряємо доменну зону, яка складається виключно з рядка букв певної кількості символів до кінця рядка

:bully: модифікатор "i" здійснюватиме пошук за регулярним виразом без урахування регістру.

:bully: модифікатор "u" необхідно додавати для правильної обробки українських символів у кодуванні UTF8 (PCRE_UTF8).

Функції для регулярних виразів:

  • Функція Preg_match дійснює пошук у рядку за регулярним виразом
  • Функція Preg_match_all шукає усі збіги
  • Функція Preg_replace крім пошуку, здійснює і заміну за регулярним виразом
  • Функція Preg_split розбиває рядок за регулярним виразом.

Модифікатори регулярок - остання літера після "/" (REGEX FLAGS):

  • (g) global - Не повертатись після першого матчу
  • (m) multi line - парсить багато строк а не одну
  • (i) insensitive  - Збіг без урахування регістру
  • (x) extended - дозволяє використовувати пробіли та коментарі-#
  • (s) single line - Крапка відповідає новому рядку
  • (u) unicode - Збіг з повним юнікодом
  • (U) Ungreedy - Зробіть квантифікатори лінивими
  • (A) Anchored - Прив'язка до початку шаблону або до кінця останнього збігу
  • (J) Jchanged - Дозволити імена підшаблонів, що повторюються.
  • (D) Dollar end only  - $ відповідає тільки кінцю шаблону

Квантифікатори або скільки разів має повторитись:

  • p+ Відповідає одному або декільком входженням літери p.
  • p* Відповідає нулю чи більше входжень літери p.
  • p? Відповідає нулю або одній появі літери p.
  • p{2} Відповідає рівно двом входженням літери p.
  • p{2,3} відповідає як мінімум двом, але не більше трьох появ літери p.
  • p{2,} Відповідає двом або більше входженням літери p.
  • p{,3} Відповідає лише трьом появам букви p
$pattern = "/[\s,]+/";
$text = "My favourite colors are red, green and blue";
$parts = preg_split($pattern, $text);

Маски в регулярках:

Маска задається круглими скобками - (), а дістається значення через $1 або $matches[1]:

//ВАРАНТ №1
$content = '⮘page-title⮚';
$oldtgrpl = '/([⮘])+([a-zA-Z0-9]+)+((?:-){1})([a-zA-Z0-9]+)+[⮚]/ui';
$content = preg_replace($oldtgrpl, "$2-$4",  $content);
print_r($content);
//РЕЗУЛЬТАТ:
page-title

//ВАРАНТ №2
$pattern = '/Міняємо автора поста ([0-9]+) з "(.+)" на "(.+)"./';
$str = 'Міняємо автора поста 123 з "Олекса" на "Богдан".';

preg_match($pattern, $str, $matches);
$articleId = $matches[1];
$oldAuthor = $matches[2];
$newAuthor = $matches[3];

var_dump($articleId,$oldAuthor,$newAuthor);
//Вивиде на екран:
:26:string '123' (length=3)
:26:string 'Олекса' (length=8)
:26:string 'Богдан' (length=8)


У жадібному режимі (за замовчуванням) квантифікатор повторюється стільки разів, скільки це можливо.

Двигун регулярного виразу намагається отримати максимальну кількість символів, що відповідають .+, а потім скорочує цю кількість символ за символом, якщо залишок шаблону не збігається.

Лінивий режим

«Лінивий» режим протилежний «жадібному». Він означає: "повторювати квантифікатор найменшу кількість разів".

Ми можемо включити його, вставивши запитання '?' після квантифікатора, тобто буде *? або +? або навіть ?? для '?'.

Прояснимо: зазвичай знак питання? сам по собі є квантифікатором (нуль або один), але якщо він доданий після іншого квантифікатора (або навіть після самого себе), він отримує інше значення - він змінює режим збігу з жадібного на лінивий.

=====

:bully: Сервіс для створення регулярок - https://regex101.com/



Залишити свій коментар:

Досвід у веброзробці:

2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2009
2023