Регулярні вирази. Частина 1. Введення. Спеціальні символи.
- основи основ
- Невеликий відступ про російські літери
- Верхній регістр букв
- Пошук відповідності на початку рядка, символ ^
- Пошук відповідності кінця рядка. У чому відмінність між \ z і $
- Спеціальні символи (метасимволи)
- Квадратні дужки [ ]
- Фігурні дужки { }
- Крапка .
- Астеріск *
- плюс +
- Знак питання ?
- Круглі дужки () і пряма риса |
- Миша Рудрастих
Нарешті я добрався до цієї статті, в ній я спробую з нуля розповісти про регулярні вирази в PHP. Для початку - що це таке?
Якщо в двох словах і зрозумілою мовою, то регулярні вирази - це метод, заснований на відповідності рядка заданим шаблоном.
основи основ
Як я вже сказав, почну з самого нуля. Недарма ж я помітив цю статтю тегом «Початківцям».
А починається все з рядка в PHP.
// створюємо рядок $ stroka = 'abcdefghijklmnopqrstuvwxyz0123456789'; // виводимо рядок echo $ stroka;Якщо нам спершу потрібно визначити, чи знаходиться abc всередині нашої рядки, і тільки тоді вивести її, то спробуємо зробити щось подібне:
// та ж сама рядок $ stroka = 'abcdefghijklmnopqrstuvwxyz0123456789'; if (preg_match ( "/ abc /", $ stroka)) {// поверне 1 в разі позитивного результату (<code> abc </ code> всередині рядка) echo $ stroka; }Код вище дан виключно для прикладу, тому що це не найоптимальніший варіант пошуку входження в рядку, для цього краще використовувати PHP-функції strpos () або strstr ().
Невеликий відступ про російські літери
Хочу звернути вашу увагу, регулярні вирази PHP за замовчуванням не підтримують російські букви і тому далеко не всі приклади будуть працювати коректно, проте це легко виправляється модифікатором / u (далі все поясню), який включає додаткову функціональність: шаблон і рядки стануть оброблятися як UTF- 8 (доступно з версії PHP 4.1.0).
Детально в наступному прикладі.
Верхній регістр букв
Символи верхнього і нижнього регістра - не одне й те саме. Однак чутливість до регістру можна відключити за допомогою модифікатора / i. Модифікатори додаються в кінці шаблону, дивіться приклад:
<? Php // рядок залишаємо поки що ту ж $ stroka = 'abcdefghijklmnopqrstuvwxyz0123456789'; if (preg_match ( "/ ABC / i", $ stroka)) {// поверне 1, але якщо прибрати i, то умова вже виконуватися не буде echo $ stroka; }А тепер те, про що я згадував вище - цей же самий приклад не буде працювати коректно з російськими буквами. Для того, щоб це виправити, ми додамо також модифікатор / u.
$ Stroka = 'абвгдеёжзіклмнопрстуфхцчшщ'иьеюя'; if (preg_match ( "/ АБВ / iu", $ stroka)) {// модифікатори можна перераховувати в будь-якому порядку echo $ stroka; }Пошук відповідності на початку рядка, символ ^
Для позначення в шаблоні початку рядка, використовується символ каретки ^.
$ Stroka = 'абвгдеёжзіклмнопрстуфхцчшщ'иьеюя'; if (preg_match ( "/ ^ абв / u", $ stroka)) {echo 'Рядок починається з абв'; }Простіше простого, вірно адже?
Пошук відповідності кінця рядка. У чому відмінність між \ z і $
Ось тут вже цікавіше. Почну з того, що є два «кінця рядка», один - це кінець строкової змінної в цілому, а інший - кінець рядка в тексті \ n, тобто далі текст триває, просто з нового рядка.
Так ось, якщо вам потрібні саме останні символи в строкової змінної, завжди використовуйте \ z.
// зверніть увагу, що після букви "р" я додав перехід на новий рядок $ stroka = 'абвгдеёжзіклмнопр \ nстуфхцчшщ'иьеюя'; if (preg_match ( "/ юя \ z / u", $ stroka)) {echo 'Текст закінчується на "юя"'; } Else {echo 'результатів, що відповідають запиту, не знайдено.' ; }Дуже часто для цих цілей використовують $ і в багатьох постах на різних сайтах теж це рекомендується, однак жодного разу не згадується, як це працює насправді.
Взагалі ми можемо в попередньому прикладі замінити \ z на $ і він буде перевіряти відповідність останніх символів у змінній, але якщо включити підтримку многострочного пошуку модифікатором / m, то символи \ n в самому рядку вже будуть сприйматися як перехід на новий рядок в тексті (для нетямущих - натискання клавіші Enter) і тоді умова стане вірним для букв тощо.
$ Stroka = 'абвгдеёжзіклмнопр \ nстуфхцчшщ'иьеюя'; if (preg_match ( "/ ін \ z / mu", $ stroka)) {// умова також буде вірним при "/ юя \ z / mu" echo 'В тексті присутній рядок, що закінчується на "пр"'; } Else {echo 'результатів, що відповідають запиту, не знайдено.' ; }Спеціальні символи (метасимволи)
Ми вже розглянули кілька простих прикладів і в процесі познайомилися з метасимвол $ і ^. Як ви вже зрозуміли, вони мають спеціальне значення в шаблоні, наприклад ^ означає початок рядка, а символ долара $ - кінець рядка (хоч і з декількома застереженнями).
А ось і інші метасимволу., *,?, {,}, [,], +, \, |, (,). Ми розглянемо їх в процесі цього уроку, а зараз важливо, щоб ви розуміли, що вони з себе представляють.
Справа в тому, що вони не позначають самі себе і тому, для того, щоб провести пошук рядка, що починається з наприклад 2 + 2, ми повинні екранувати +.
<? Php $ stroka = '2 + 2 = 4'; // екранування відбувається за допомогою зворотного слеша \ if (preg_match ( "/ ^ 2 \ + 2 /", $ string)) echo 'Рядок починається з 2 + 2';Як бачите в цьому випадку функція метасимвола + проігнорував і він був сприйнятий як звичайний символ плюса в рядку.
Квадратні дужки [ ]
Отже, квадратні дужки дозволяють вказати набір символів в шаблоні, які можуть бути просто перераховані [абвгд], або задані проміжком [а-д].
Зверніть увагу, що такі інтервали символів означають тільки 1 символ, що належить цьому інтервалу.
$ Stroka = 'маг'; // для російських букв не забуваємо модифікатор / u echo preg_match ( "/ м [a-к] г / u", $ stroka);Цей приклад поверне 1 як для «маг», так і наприклад для «мить».
Інші метасимволу, перераховані в квадратних дужках не працюють, тому екранувати їх не потрібно, наприклад в цьому шаблоні [абв50 $] долар буде позначати сам себе.
Але є й винятки, куди вже без них - якщо всередині квадратних дужок першим вказати символ каретки ^, то він буде означати зовсім не початок рядка, а невідповідність набору символів, наприклад [^ б] - буде значать будь-який символ, крім «б», [^ а-і] - будь-який символ, що не знаходиться в проміжку «а-і». Звідси приклад:
$ Stroka = 'абвгдеёжзіклмнопрстуфхцчшщ'иьеюя'; // для того, щоб функція не просто повертала 1, ми додамо в неї третій аргумент, змінну, в яку запишеться що збігається preg_match ( "/ [^ а-д] / u", $ stroka, $ matches); // змінна $ matches буде містити що збігається - букву "е" foreach ($ matches as $ key => $ value) {echo $ key. ' -> '. $ Value; // 0 -> e}Для того, щоб вивести всі відповідні нам символи, ми просто замінимо функцію preg_match () на preg_match_all ().
$ Stroka = 'абвгдеёжзіклмнопрстуфхцчшщ'иьеюя'; preg_match_all ( "/ [^ а-д] / u", $ stroka, $ matches); // елемент $ matches [0] буде містити масив (!) З відповідних символів, кожен символ - окремий елемент масиву foreach ($ matches [0] as $ symbol) {echo $ symbol; } // в результаті вийде еёжзіклмнопрстуфхцчшщ'иьеюяФігурні дужки { }
Фігурні дужки дозволяють вказати, скільки разів повинен бути представлений в рядку символ (або набір символів), що стоїть перед ними.
$ Stroka = 'PHP123'; echo preg_match ( "/ PHP [0-9] {3} /", $ stroka);Крапка .
Точка позначає будь-який один символ, крім переходів на новий рядок \ n або \ r.
$ Stroka = 'цей маг'; // виведе 1, тобто збіг знайдено, але без прапора / u працювати як треба не буде echo preg_match ( "/м.г/u", $ stroka);Астеріск *
Зірочка означає будь-яку кількість символу, що стоїть перед нею (в тому числі 0). Поясню на прикладі.
$ Stroka = 'php'; // буде виведена 1 як для "php", так для "pp", "phhp", "phhhhhhhp" echo preg_match ( "/ ph * p /", $ stroka);плюс +
Плюс практично аналогічний зірочці за одним єдиним винятком - він не враховує відсутність символу, тобто, якщо взяти попередній приклад і рядок pp, то буде виведений 0.
Знак питання ?
Знак питання - це один символ стоїть перед ним, або його відсутність. Наприклад, їм дуже зручно перевіряти телефонні номери (як ви знаєте, іноді в номерах вказуються дефіси, а іноді немає).
$ Stroka = '123-567'; // буде виведена 1, а також в тому випадку, коли дефіс в рядку буде відсутній. echo preg_match ( "/ 123-? 567 /", $ stroka);Круглі дужки () і пряма риса |
Даний набір символів підтримує більше логічних умов АБО.
$ Stroka = "Привіт, світ!" ; // try to match the patterns This OR That OR There echo preg_match ( "/ ^ (Привіт | Здрастуй | Хай) /", $ stroka);Якщо ми трохи змінимо цей приклад, то функція може показати нам, який саме з умов підійшло.
$ Stroka = "Привіт, світ!" ; // try to match the patterns This OR That OR There preg_match ( "/ ^ (Привіт | Здрастуй | Хай), світ /", $ stroka, $ matches); foreach ($ matches as $ key => $ value) {echo $ key .'-> '. $ value.' <br /> '; } / * В результаті отримаємо 0-> Привіт, світ 1-> Привіт Тобто перший елемент масиву - це знайдений підрядок, відповідна під шаблон, а другий - яке саме умова підійшло. * /Миша Рудрастих
Вперше познайомився з WordPress в 2009 році. З 2014 року мене можна зустріти на WordCamp - офіційної конфе по WordPress, іноді там виступаю. Також в даний час веду курси по WordPress в Epic Skills .
Якщо вам потрібна допомога з вашим сайтом або може навіть розробка з нуля - пишіть мені .
Для початку - що це таке?Lt;?
Quot;/ 123-?