Регулярні вирази

Нарешті я дістався цієї статті, в ній я спробую з нуля розповісти про регулярні висловлювання в PHP. Для початку – що це таке?

Якщо двома словами і зрозумілою мовою, то регулярні висловлювання — це метод, заснований на відповідності рядка заданому шаблону.

Основи основ

Як я вже сказав, почну з самого нуля. Недарма ж я помітив цю статтю тегом «початківцям».

А починається все з рядка в PHP.

Якщо нам спершу потрібно визначити, чи знаходиться abc усередині нашого рядка, і тільки тоді вивести її, то спробуємо зробити щось подібне:

Код вище дано виключно для прикладу, тому що це не оптимальний варіант пошуку входження в рядку, для цього краще використовувати PHP-функції strpos() або strstr() .

Невеликий відступ про українські літери

Хочу звернути вашу увагу, регулярні вирази PHP за умовчанням не підтримують українські літери і тому далеко не всі приклади працюватимуть коректно, проте це легко виправляється модифікатором /u (далі все поясню), який включає додаткову функціональність: шаблон і рядки будуть оброблятися як UTF- 8 (доступно з версії PHP 4.1.0).

Детально в прикладі.

Верхній регістр літер

Символи верхнього і нижнього регістру — не те саме. Однак чутливість до регістру можна вимкнути за допомогою модифікатора /i. Модифікатори додаються в кінці шаблону, дивіться приклад:

А тепер те, про що я згадував вище, — цей самий приклад не працюватиме коректно з українськими літерами. Для того щоб це виправити, ми додамо також модифікатор /u.

Пошук відповідності на початку рядка, символ ^

Для позначення у шаблоні початкурядка використовується символ каретки ^ .

Простіше простого, правда ж?

Пошук відповідності кінця рядка. У чому різниця між \z і $

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

Так ось, якщо вам потрібніостанні символи в рядковій змінній, завжди використовуйте \z .

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

Взагалі ми можемо в попередньому прикладі замінити \z на $ і він перевірятиме відповідність останніх символів у змінній, але якщо включити підтримку багаторядкового пошуку модифікатором /m, то символи \n у самому рядку вже будуть сприйматися як перехід на новий рядок у тексті (для нетямущих - натискання клавіші Enter) і тоді умова стане вірною для літер ін.

Спеціальні символи (метасимволи)

Ми вже розглянули кілька простих прикладів і у процесі познайомилися з метасимволами $ і ^. Як ви вже зрозуміли, вони мають спеціальне значення в шаблоні, наприклад, означає початок рядка, а символ долара $ — кінець рядка (хоч і з кількома застереженнями).

А ось і інші метасимволи. , *,? , < , >, [ , ] , + , \ , , ( , ). Ми розглянемо їх у процесі цього уроку, а зараз важливо, щоб ви розуміли, що вони являють собою.

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

Як бачите в даному випадку функція метасимволу + проігнорувалося і він був сприйнятий як звичайний символплюс у рядку.

Квадратні дужки [ ]

Отже, квадратні дужки дозволяють вказати набір символів у шаблоні, які можуть бути перераховані [абвгд], або задані проміжком [а-д].

Зверніть увагу, що такі інтервали символів означають лише 1 символ, що належить до цього інтервалу.

Цей приклад поверне 1 як «маг», так і наприклад для «миг».

Інші метасимволи, перелічені у квадратних дужках не працюють, тому екранувати їх не потрібно, наприклад, у цьому шаблоні [абв50$] долар буде позначати сам себе.

Але є й винятки, куди вже без них — якщо всередині квадратних дужок першим вказати символ каретки ^ , то він означатиме аж ніяк не початок рядка, а невідповідність набору символів, наприклад [^б] — означатиме будь-який символ, крім «б», [^а-і] — будь-який символ, що не перебуває у проміжку «а-і». Звідси приклад:

Для того, щоб вивести всі відповідні символи, ми просто замінимо функцію preg_match() на preg_match_all() .

Фігурні дужки

Фігурні дужки дозволяють вказати, скільки разів має бути представлений у рядку символ (або набір символів), що стоїть перед ними.

Точка позначає будь-який символ, крім переходів на новий рядок \n або \r .

Зірочка означає будь-яку кількість символу, що стоїть перед нею (у тому числі 0). Поясню з прикладу.

Плюс практично аналогічний зірочці за одним єдиним винятком - він не враховує відсутність символу, тобто якщо взяти попередній приклад і рядок pp, то буде виведено 0.

Знак питання ?

Круглі дужки ( ) та пряма риса

Даний набір символів дозволяє встановити декілька логічних умов АБО.

Якщо ми трохи змінимо цей приклад, то функція може показати нам, яка саме з умовпідійшло.

Михайло Рудрастих

Вперше познайомився з WordPress у 2009 році. З 2014 року мене можна зустріти на WordCamp — офіційній цукерці WordPress, іноді там виступаю. Також зараз веду курси з WordPress в Epic Skills.

Якщо вам потрібна допомога з вашим сайтом або навіть розробка з нуля — пишіть мені.