PHP робота з регулярними виразами
Що таке регулярні вирази
В основному роботу регулярних виразів можна описати приблизно наступним шляхом, регулярне вираження це метод зіставлення із зразком або узгоджувальних моделей у рядку. У PHP найчастіше використовується PCRE або “Perl Compatible Regular Expressions”. Сьогодні ми залишимо прості методи пошуку рядків і працюватимемо з сильнішим інструментом, яким багато хто користується але не знає як він працює. Тут ми спробуємо декодувати безглузді ієрогліфи, якими їх усі вважають і зробимо це на прикладах.. Найголовніша помилка ті хто вивчає регулярні вирази це спроба зрозуміти все в один раз..
Починаємо вивчення
Створіть у себе на тестовому сервері файл index.php та розмістіть у нього код:
1 2 3 4 5 6 7 8 |
<?php // create a string $string = 'abcdefghijklmnopqrstuvwxyz0123456789'; // echo our string echo $string; ?> |
Дещо модифікуємо код і допишемо функцію preg_match().
1 2 3 4 5 6 |
<?php // create a string $string = 'abcdefghijklmnopqrstuvwxyz0123456789'; echo preg_match("/abc/", $string); ?> |
Після запуску скрипту ми отримаємо 1, а це означає, що частина тексту була знайдена в рядку $string (PHP 1 та TRUE рівні відповіді).
Ми прищепили приклад того, як знайти рядок, але є спосіб зробити це швидше через стандартні функції php StrPos () і strstr ().
Вказівка початку рядка в регулярному виразі
Для вказівки початку рядка у виразі необхідно додати піктограму ^, давайте будемо менше говорити і спробуємо практично змінити наш код до наступного виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php // create a string $string = 'abcdefghijklmnopqrstuvwxyz0123456789'; // try to match the beginning of the string if(preg_match("/^abc/", $string)) { // если строка была найдена и условие выполняется echo 'Эта строка начинается с abc'; } else { // Если строка не найдена и условие не было выполнено echo 'Ничего не найдено'; } ?> |
Після виконання коду ви побачите напис “Цей рядок починається з abc”, тому що наш рядок дійсно починається з букв “abc”. символ (^) дає нам пошук тільки на початку рядка, але не по всій. Ця конструкція за замовчуванням враховує регістр.
Пошук підрядки на початку без урахування регістру
Раніше ми використали комбінацію if(preg_match(“/^ABC/”, $рядок)), але ця комбінація видала б помилковий результат, оскільки вона враховує регістр літер. Розглянемо PHP код, який не враховуватиме регістр літер при пошуку.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // создаем строку $string = 'abcdefghijklmnopqrstuvwxyz0123456789'; // попробуем шаблон поиска if(preg_match("/^ABC/i", $string)) { // если поиск удался echo 'строка начинается на ABC'; } else { echo 'Ничего не найдено'; } ?> |
Конструкція трохи змінилася і був доданий ще один модифікатор i preg_match(“/^ABC/i«, $рядок) – нечутливий до регістру (реєстронезалежний). Після наших поправок скрипт відмінно знаходитиме підрядок.
Як знайти рядок по її кінцівці
Багато в чому пошук рядка на її кінцівці схожий на попередній приклад. Все що необхідно додати z до кінця шаблону пошуку.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php // создадим строку $string = 'abcdefghijklmnopqrstuvwxyz0123456789'; // Шаблон поиска строки по ее окончанию if(preg_match("/89\z/i", $string)) { // если наш шаблон сработает, то выведет на экран ... echo 'Конец строки равен 89'; } else { // если шаблон поиска не сработает echo 'Ничего не найдено'; } ?> |
Оскільки наш рядок закінчується на 89 і шаблон пошуку відповідає кінцю рядка, то результат буде “Кінець рядка дорівнює 89”.
Мета символ
Ми з вами вже використовували спеціальні символи, такі як (^) і ($) ці символи, поряд з іншими називають мета символами. Ось список мета символів які також використовуються в регулярних виразах:
. (Повна зупинка)
^ (Карат) - Початок рядка
* (Астерікс) – означає будь-яку кількість символів у рядку, попередніх "зірочці", у тому числі і нульова кількість символів.
+ (Плюс) - Вказує на те, що попередній символ або вираз зустрічається 1 або більше разів. Відіграє ту ж роль, що й символ “зірочка” (*), за винятком випадку нульової кількості входжень.
? (Знак питання) – означає, що попередній символ або регулярний вираз зустрічається 0 або 1 раз. В основному використовується для пошуку одиночних символів.
{ (Відкриття фігурної дужки)
} (Закриваюча фігурна дужка) – {a,b} - кількість входжень попереднього символу або підмаски від a до b. Якби не вказано, вважається, що верхнього кордону немає. Наприклад, * - теж саме, що {0,}. ? – те саме, що {0,1}. {5,7} – 5,6 або 7 повторень.
[ (Розкриваюча дужка)
] (Закриваюча дужка) – призначені для завдання підмножини символів. Квадратні дужки, всередині регулярного виразу, вважаються одним символом, який може приймати значення, перелічені всередині цих дужок.
\ (Зворотна коса риска) – служить для екранування спеціальних символів, це означає, що екрановані символи повинні інтерпретуватися буквально, тобто. не як мета символи, а як прості символи.
| (Труба) - Виконує роль логічного оператора “АБО” у регулярних виразах та служить для завдання набору альтернатив повторно(a|д)d’.
( (Відкриваючі дужки)
) (Закриваючі дужки) – призначені виділення груп регулярних выражений. Вони корисні при використанні з оператором “|” та при вилученні підрядка за допомогою команди вираз.
Ми розглянемо кожен із мета символів на прикладах під час цього уроку, але важливо, Щоб ви знали, які вони є. Якщо ви хочете знайти рядок, що містить один із цих символів, наприклад: «1 + 1«, то вам потрібно, щоб програма вважала їх звичайними символами, а не мета символами, для цього додамо зворотну косу межу та заекрануємо символ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // создаем строку $string = '1+1=2'; // пробуем использовать нашу строку if(preg_match("/^1\+1/i", $string)) { // если выражение вернуло истину echo 'Строка начинается с 1+1'; } else { echo 'Ничего не найдено'; } ?> |
У цьому прикладі \ заекранував плюс і вираз використовував його як звичайний символ, в іншому випадку вираз спрацював би як хибне.
Розглянемо, що можуть робити інші мета символи
Ми вже бачили символ каретки^ і долар $? давайте подивимося на інші, починаючи з квадратних дужок []. Квадраті дужки призначені для пошуку символів [abcdef] або діапазон символів [а-ф]. Подивимося на приклад регулярного виразу:
1 2 3 4 5 6 7 8 |
<?php // Создадим строку $string = 'big'; // ищем подстроку в строке echo preg_match("/b[aoiu]g/", $string, $matches); ?> |
Вираз поверне істину, якщо в рядку зустрічаються слова big, болото, помилка, мішок, але не просити.
Ще можна використати ось таку комбінацію [abcdef$], в даному випадку знак $ буде всього лише доларом, але не мета символом. Практично всі цілі символи не мають значення, за винятком деяких випадків.
Давайте спробуємо наступний скрипт:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // Создаем стоку string $string = 'abcefghijklmnopqrstuvwxyz0123456789'; // обрабатываем строку и помещаем результат в виде массива в $matches preg_match("/[^b]/", $string, $matches); // Цикл вывода массива matches foreach($matches as $key=>$value) { echo $key.' -> '.$value; } ?> |
Результатом роботи скрипту буде висновок 0 -> a скрипт виводить символи до символу b.
Спробуємо трохи модифікувати наш скрипт і використовувати функцію preg_match_all().
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // create a string $string = 'abcefghijklmnopqrstuvwxyz0123456789'; // try to match all characters not within out pattern preg_match_all("/[^b]/", $string, $matches); // loop through the matches with foreach foreach($matches[0] as $value) { echo $value; } ?> |
Як ви можете бачити з результатів наведеного вище сценарію, він друкує всі символи рядка, які не відповідають шаблону “B”
acefghijklmnopqrstuvwxyz0123456789.
Зробимо ще один крок вперед для того, щоб відфільтрувати всі цифри з рядка:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // создадим строку $string = 'abcefghijklmnopqrstuvwxyz0123456789'; // В массив matches помещаются все символы кроме цифр от 0 до 9 preg_match_all("/[^0-9]/", $string, $matches); // цикл вывода данных foreach($matches[0] as $value) { echo $value; } ?> |
Цей скрипт повертає рядок:
abcefghijklmnopqrstuvwxyz
Виходячи з вище зазначеного коду ми можемо бачити, що знак ^ у наведених вище прикладах означає заперечення (Усі крім перелічених символів).
Залишайтеся з нами, далі ще цікавіше
Спробуємо використовувати екранування мета символів, щоб використовувати їх у пошуку. Найпростіше буде зрозуміти на основі результату, на прикладі:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // Создаем строку $string = 'This is a [templateVar]'; // Попробуем использовать наше регулярное выраение preg_match_all("/[\[\]]/", $string, $matches); // выводим результат в цикле foreach($matches[0] as $value) { echo $value; } ?> |
Результатом роботи скрипту буде:
[]Це тому що ми вказали що хочемо взяти всі символи що відповідають []. Для того щоб вираз спрацював правильно, ми використовували косі риси., якщо вам треба, щоб коса риса розцінювалася як простий символ, вам буде необхідно вказати дві косі риси \\, наприклад для такого виразу c:\dirfile.php.
Розглянемо роботу з оператором крапкою ( . ) на простому прикладі:
1 2 3 4 5 6 7 8 |
<?php // создадим строку $string = 'sex at noon taxes'; // обработаем строку по шаблону регулярного выражения echo preg_match("/s.x/", $string, $matches); ?> |
В результаті ми отримаємо 1, тому що в нашому рядку є слово sex, цей вислів також знаходитиме слова SOX, SUX і SX, але не знаходитиме Stix.
Давайте спробуємо порахувати кількість слів у рядку за допомогою регулярного виразу з точкою.
1 2 3 4 5 6 7 8 9 10 11 |
<?php // создаем строку $string = 'sex'."\n".'at'."\n".'noon'."\n".'taxes'."\n"; // Выводим строку на экран echo nl2br($string); // Посмотрим результат регулярного выражения (4) echo preg_match_all("/\s/", $string, $matches); ?> |
Код вище поверне це:
секс
в
полудень
податки
4
Спочатку ми вивели рядок, а оператор виставив переноси. Нижче ми бачимо число 4, це кількість слів яке знайшла функція preg_match_all ().
Давайте далі ми попрацюємо з мета символом ( * ). Цьому оператору буде відповідати будь-яка кількість будь-яких символів., які можуть бути до оператора, а можуть і не існувати. Подивимося на приклад нижче:
1 2 3 4 5 6 7 8 |
<?php // создаем строку $string = 'php'; // посмотрим результат выражения echo preg_match("/ph*p/", $string, $matches); ?> |
В результаті ми отримаємо 1 оскільки ми знайшли 1 вираз, який відповідає виразу. Також вірним буде вираз pp (без символів) і phhhp (з кількома символами).
Якщо нам потрібно виключити порожній результат виду pp, то можна використовувати мета символ ( + ). Подивимося на прикладі:
1 2 3 4 5 6 7 8 |
<?php // создаем строку $string = 'pp'; // получаем результат регулярного выражения echo preg_match("/ph+p/", $string, $matches); ?> |
Використання символу ( + ) працює схоже на ( * ), але плюс не враховує пусте значення.
Наш наступний мета символ питання питання ( ? ), він означає, що попередній символ може бути, а може й не бути. Прикладом може бути написання телефонного номера, обидва висловлювання будуть істиною (1234-5678) і (12345678).
1 2 3 4 5 6 7 8 9 |
<?php // создаем строку $string = '12345678'; // возвращает 1 echo preg_match("/1234-?5678/", $string, $matches); ?> |
Аналогічний результат буде при використанні наступного коду:
1 2 3 4 5 6 7 8 9 |
<?php // create a string $string = '1234-5678'; // look for a match echo preg_match("/1234-?5678/", $string, $matches); ?> |
Далі у нас є фігурні дужки або {} метасимвол. Задають кількість входжень попереднього виразу чи діапазону. Фігурні дужки обов'язково повинні екрануватися косою межею “[0-9]\{5\}».
Вираз “[0-9]\{5\}» – відповідає підрядку з п'яти десяткових цифр (символів з діапазону від 0 до 9, включно).
Далі ми будемо використовувати вираз у якому після тексту “PHP” обов'язково маємо доповнитися рівно 3 цифрами.
1 2 3 4 5 6 7 8 9 |
<?php // создаем строку $string = 'PHP123'; // посмотрим на результат echo preg_match("/PHP[0-9]{3}/", $string, $matches); ?> |
Результатом регулярного вираження буде істина (1). З регулярного виразу видно що воно має починатися текстом PHP і доповнюватись трьома цифрами від 0 до 9.
Спеціальні послідовності
Зворотна коса риса також використовується для спеціальних послідовностей. Давайте розберемося які бувають послідовності?
- \d – виражає будь-які цифрові символи подібно до виразу [0-9]
- \D – відповідає будь-яким цифровим символам подібно [^0-9]
- \s – відповідає будь-яким символам виду [ \тнрфв]
- \S – відповідає будь-якому символу виду [^ tnrfv]
- \w – відповідає будь-яким алфавітно цифровим символам та символу нижнього підкреслення подібно [a-zA-Z0-9_]
- \W – відповідає будь-яким алфавітно цифровим символам та символу нижнього підкреслення подібно [^a-zA-Z0-9_]
Ці послідовності можна використовувати для скорочення ваших регулярних виразів. Наступний приклад показує, як можна очистити рядок від зайвих символів..
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // создаем строку $string = 'ab-ce*fg@ hi & jkl(mnopqr)stu+vw?x yz0>1234<567890'; // выполняем регулярное выражение preg_match_all("/[\w]/", $string, $matches); // выводим результат выражения foreach($matches[0] as $value) { echo $value; } ?> |
Такий вираз буде корисним, якщо вам потрібно почистити логін користувача, від зайвих та неприпустимих символів.
Також при чищенні рядка часто необхідно переконатися, що рядок не починається з цифр, це можна зробити за допомогою наступного прикладу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // создаем строку $string = '2 bad for perl'; // Проверяем строку на наличие цифры в начале if(preg_match("/^\d/", $string)) { echo 'Стока начинается из цифр'; } else { echo 'В начале строки нет цифр'; } ?> |
Цей приклад покаже, що в рядку спочатку будує цифра 2.
Давайте скористаємося точкою щоб визначити чи є в рядку хоча б один символ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // create a string $string = 'abcdefghijklmnopqrstuvwxyz0123456789'; // try to match any character if(preg_match("/./", $string)) { echo 'Строка содержит хотя бы один символ'; } else { echo 'Строка несодержит ниодного символа'; } ?> |
точка ( . ) означає будь-якого символу, не менше одного, за винятком символу перекладу рядка (\п).
Спробуємо використовувати послідовність для отримання кількості слів у рядку розділеного n.
1 2 3 4 5 6 7 8 9 10 11 |
<?php // создаем строку $string = 'sex'."\n".'at'."\n".'noon'."\n".'taxes'."\n"; // выводим строку echo nl2br($string); // смотрим на результат выражения echo preg_match_all("/\s/", $string, $matches); ?> |
Результат виразу:
секс
в
полудень
податки
4
Підсумуємо наші знання
Почнемо поєднувати наші висловлювання у складніший вигляд. Наступний вираз показує, що в рядку має бути одне зі слів This або That або There.
1 2 3 4 5 6 7 |
<?php // пример строки $string = "This is a Hello World script"; // Находит в строке одby из шаблонов This или That или There echo preg_match("/^(This|That|There)/", $string); ?> |
Ще один цікавий приклад скрипту для визначення початку слова.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // присваиваем переменной строку $string = "This is a Hello World script"; // попробуем задействовать шаблон выражеия Jello или Hello if(!preg_match("/(Je|He)llo/", $string)) { echo 'Pattern not found'; } else { echo 'pattern found'; } ?> |
Давайте ще доповнимо надрукований вище код, щоб ми могли побачити з яких саме символів починається слово та виведемо ці символи та саме слово на екран:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // создаем строку $string = "This is a Hello World script"; // проверяем шаблон выражения Jello или Hello // записываем результат обработки регулярного выражения в массив matches preg_match("/(Je|He)llo/", $string, $matches); // выводим полученный массив matches на экран при помощи цикла foreach($matches as $key=>$value) { echo $key.'->'.$value.'<br />'; } ?> |
Якщо ви все зробили правильно, то результатом виразу буде:
0->Привіт
1->Він
$сірники[0] містить повний текст шаблону виразу – Hello.
$сірники[1] містить першу частину шаблону виразу.
Модифікатори та затвердження
Як ми бачили раніше в цьому уроці, ми змогли створити регулярний вираз, яке було чутливе до регістру з використанням /i . Це модифікатор і є одним із багатьох використовуваних у регулярних виразах для виконання змін у поведінці зіставлення зі зразком. Ось список з модифікаторів та тверджень регулярних виразів, використовуються в PHP.
Модифікатори
i – реєстронезалежність.
U – інвертує жадібність. це означає, що шаблон збігається з найбільшою можливою кількістю символів, які під цей шаблон.
s – якщо використовується, то символ . відповідає і перекладу рядка n. Інакше вона йому не відповідає.
m – мультирядок (Кілька рядків)
x – змушує ігнорувати усі неекрановані пробільні символи, якщо вони не перераховані у символьному класі. Комфортно, коли ентерами і пробілами ви хочете навести зручно читання в регулярні.
e – Якщо використовується цей модифікатор, preg_replace() після виконання стандартних підстановок в рядку, що замінюється, інтерпретує її як PHP-код і використовує результат для заміни шуканого рядка. Одинарні та подвійні лапки, зворотні слеші (\) NULL-символи будуть проекрановані зворотними слешами в зворотних посиланнях, що підставляються.. (Працює лише з preg_replace).
S – у разі, якщо планується багаторазово використовувати шаблон, має сенс витратити трохи більше часу на його аналіз, щоб зменшити час його виконання. В разі, якщо цей модифікатор використовується, проводиться додатковий аналіз шаблону. На даний момент це має сенс тільки для “незаякорених” шаблонів., не починаються з певного символу. Про це трохи пізніше.
Твердження
б – межа слів (межа слова)
Кордон слова створюється між двох "b" модифікаторів.
Це спеціальний “підпираючий тип модифікаторів, які дозволяють вказати ТОЧНИЙ Збіг.
Текст повинен збігтися тільки з точним шаблоном, укладеним у “b”
Наприклад, шаблон "кішка" не відповідає "каталогу".
Б – Без межі слів (не є межею слова)
Цей модифікатор відноситься до попереднього, але B не ставить умови гранця слова, а навпаки заперечує межу слів. Цей модифікатор корисний, коли потрібно знайти щось усередині тексту, який знаходиться всередині слова, але не на самому початку чи наприкінці фрази.
A – PCRE_ANCHORED
Якщо використовується цей модифікатор, відповідність шаблону досягатиметься лише в тому випадку, якщо він "заякорений", тобто. відповідає початку рядка, в якій проводиться пошук. Того ж ефекту можна досягти відповідною конструкцією з вкладеним шаблоном, яка є єдиним способом реалізації цієї поведінки у Perl.
Z – вказівка кінця рядка.
кінець даних або позиція перед останнім перекладом рядка (незалежно від багаторядкового режиму).
z – вказівка кінця рядка.
кінець даних (незалежно від багаторядкового режиму).
G – перша позиція, що збігається в рядку.
Попрацюємо з модифікаторами та твердженнями на прикладах
Як ви можете бачити з наведеного вище списку, є багато способів, щоб змінити поведінку регулярних виразів, давайте спробуємо попрацювати з модифікаторами та твердженнями по черзі на простих прикладах.
Модифікатор (i)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // создаем строку $string = 'abcdefghijklmnopqrstuvwxyz0123456789'; // создадим новое регулярное выражение if(preg_match("/^ABC/i", $string)) { echo 'Строка начинается с abc'; } else { echo 'Ничего не найдено'; } ?> |
Якщо ви читали попередні частини цього уроку не буде ніякого подиву, що дана конструкція вважала схожими "ABC" і з abc, тому що ми використовували модифікатор реєстронезалежності (i) .
Модифікатор (с)
Продовжимо вивчення та розглянемо модифікатор (с). Якщо використовується цей модифікатор, то символ ( . ) відповідає і перекладу рядка n. Інакше вона йому не відповідає. Спершу ми спробуємо приклад без модифікатора (с).
1 2 3 4 5 6 7 8 9 |
<?php // создаем строку для выражения $string = 'sex'."\n".'at'."\n".'noon'."\n".'taxes'."\n"; // обрабатываем строку echo preg_match("/sex.at.noon/", $string, $matches); ?> |
Як бачимо цей приклад повернув відповідь ( 0 ), для того, щоб результат був позитивний ( 1 ), а символ ( . ) враховував n, необхідно додати у вираз модифікатор ( с )? перебудуємо наш приклад.
1 2 3 4 5 6 7 |
<?php // создадим строку $string = 'sex'."\n".'at'."\n".'noon'."\n".'taxes'."\n"; // обрабатываем строку при помощи выражения echo preg_match("/sex.at.noon/s", $string, $matches); ?> |
Наведений вище код відображатиме число 1, оскільки рядок за шаблоном виразу було знайдено.
Модифікатор (м)
При додаванні модифікатора до рядка, відбуватиметься цікава магія. Регулярний вираз сприйматиме один рядок як кілька, якщо в ній стоїть перенесення n. Для того, щоб було простіше зрозуміти дію модифікатора, подивіться на приклад.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php // создаем строку $string = 'sex'."\n".'at'."\n".'noon'."\n".'taxes'."\n"; // проверяем результат if(preg_match("/^noon/im", $string)) { echo 'Шаблон найден'; } else { echo 'Шаблон ненайден'; } ?> |
У цьому прикладі ми за допомогою мета символу ( ^ ) шукаємо слово noon на початку рядка. Наш рядок починається зі слова sex, а значить у звичайному випадку ми б не знайшли шукане слово. Так як у нашому прикладі всі слова розділені n і стоїть модифікатор ( м ), то кожне слово сприйматиметься як початок рядка. Щоб при пошуку не враховувався регістр літер, ми ще додали модифікатор ( i ). Якщо уважно подивіться на приклад вище, то побачите що можна використовувати кілька модифікаторів поряд.
Модифікатор ( x ) робить наш вираз довшим, але він дозволяє ділити регулярний вираз на кілька рядків і дає можливість прокоментувати кожну дію у виразі., коментарі в регулярних висловлюваннях роблять їх зрозумілішими. Далі описувати немає сенсу, просто подивіться як буде працювати такий регулярний вираз, воно працює як і попереднє але має коментарі та моїфікатори ( imx ).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php // создаем строку $string = 'sex'."\n".'at'."\n".'noon'."\n".'taxes'."\n"; // шаблон поиска регулярного выражения с комментариями и модификатором (x) $regex =' / # opening double quote ^ # caret means beginning of the string noon # the pattern to match /imx '; // Проверка результата if(preg_match($regex, $string)) { echo 'Шаблон найден'; } else { echo 'Шаблон ненайден'; } ?> |
Наступний наш модифікатор це ( С ), за допомогою нього можна зробити аналіз рядка до порівняння з шаблоном. Вираз може спростити виконання шаблону у випадку множинного входження.
Розглянемо приклад множинного входження (збіги):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php // создаем строку $string = 'ab-ce*fg@ hi & jkl(mnopqr)stu+vw?x yz0>1234<567890'; // проверка соответствия регулярного выражения preg_match_all("/[\w]/S", $string, $matches); // вывод совпадений с шаблоном в цикле foreach($matches[0] as $value) { echo $value; } ?> |
Модифікатор ( С ) використовують рідко, але раптом він вам зустрітися ви знатимете для чого він потрібен, або знати де можна почитати про цього модифікатора.
Далі ми попрацюємо з межами слів., цей модифікатор дозволяє нам чітко визначити де починається та закінчується слово. Часта помилка програмістів у використанні цього модифікатора для пошуку входження. Пошук входження з b поверне результат false. Розглянемо з прикладу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php /*** a simple string ***/ $string = 'eregi will not be available in PHP 6'; /*** here we will try match the string "lab" ***/ if(preg_match ("/\blab\b/i", $string)) { /*** if we get a match ***/ echo $string; } else { /*** if no match is found ***/ echo 'No match found'; } ?> |
Шукане слово lab не було знайдено у слові available через використання b у шаблоні. Для модифікатора b у пошуку, слова cat та catalog будуть різними словами.
Розглянемо ще один приклад пошуку виразу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php /*** создаем строку ***/ $string = 'eregi will remain in the computer lab'; /*** проверяем строку на слово "lab" ***/ if(preg_match ("/\blab\b/i", $string)) { /*** если получили результат true, выводим строку ***/ echo $string; } else { /*** если ничего не найдено, выводим false ***/ echo 'Ничего не было найдено'; } ?> |
Пошук вдався!
Модифікатор B
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php /*** создаем строку ***/ $string = 'This lathe turns wood.'; /*** проверяем границу слова ***/ if(preg_match("/\Bthe\b/", $string)) { /*** если граница слова найдена ***/ echo 'Граница слова найдена "the".'; } else { /*** если не было ничего найдено ***/ echo 'Ничего не нашли'; } ?> |
Цей модифікатор (\Б) заперечує межу слова. Модифікатор буде корисним у випадку коли необхідно знайти що-небудь усередині тексту, за шаблоном, який знаходиться всередині слова, але не на самому початку чи наприкінці фрази.
Приклад зі словом, яке починається заданим входженням
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php /*** a little string ***/ $string = 'The quick brown fox jumps over the lazy dog.'; /*** match word boundary and non-word boundary ***/ if(preg_match("/\Bthe\b/", $string)) { /*** if we match the pattern ***/ echo 'Matched the pattern "the".'; } else { /*** if no match is found ***/ echo 'No match found'; } ?> |
На прикладі вам має бути зрозуміло, чому слово “the” не було знайдено, все тому, що ми за допомогою регулярного виразу “/Btheb/” вказали що “the” це кінець слова, але не ціле слово.
Модифікатор U використовується для інвертування жадібності.
Цей модифікатор інвертує жадібність квантіфікаторів, таким чином вони за замовчуванням не жадібні. Але стають жадібними, якщо за ними слідує символ ?. Його також можна встановити за допомогою (?U) налаштування модифікатора всередині шаблону або додавши знак питання після квантифікатора (наприклад, .*?).
Приклад використання жадібних і лінивих виразів з wikipedia
Вираз (<.*>) відповідає рядку, містить кілька тегів HTML-розмітки, повністю.
<стор><b>wp-admin.com.ua</b> — уроки розробки сайтів та <i>cms wordpress</i> </стор>
Щоб виділити окремі теги, можна застосувати ліниву версію цього виразу: (<.*?>) Їй відповідає не весь показаний вище рядок, а окремі теги (виділені кольором):
<стор><b>wp-admin.com.ua</b> — уроки розробки сайтів та <i>cms wordpress</i></стор>
Використання preg_replace
Думаю тут простіше буде спробувати ввести поданий код і подивитися на результат роботи функції.
1 2 3 4 5 6 7 8 9 10 |
<?php // создаем строку $string = 'wp-admin.com.ua один из нелюбимых сайтов'; // ищем и заменяем строку по шаблону регулярного выражения $string = preg_replace("/нелюбимых/", 'любимых', $string); // выводим новую строку echo $string; ?> |
Багато розробників можуть дорікнути що робота з функцією str_replace() проходить набагато швидше, але ми зараз лише навели простий приклад, далі буде цікавіше.
Розглянемо складніший приклад заміни за допомогою функції preg_replace().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php // создаем строку с некоторыми метками $string = 'Вы находитесь на сайте {_URL_} это лучший сайт в {_INET_}'; // создаем массив элементов для замены $template_vars=array("URL" => "wp-admin.com.ua", "INET" => "рунете"); // заменяем метки в строке на соответствующие элементы массива $string = preg_replace("/{_(.*?)_}/ime", "\$template_vars['$1']",$string); // выводим полученную строку echo $string; ?> |
Попрацювавши з таким простим кодом, ми можемо побачити, наскільки роздуті шаблонні движки і системи управління., але це так просто..
https://www.php.su/lessons/?lesson_17
https://www.skillz.ru/dev/php/article-Regulyarnye_vyrazheniya_dlya_chaynikov.html
https://www.phpro.org/tutorials/Introduction-to-PHP-Regex.html
https://www.compileonline.com/execute_php_online.php