Регулярні вирази. Частина 1. Введення. Спеціальні символи.

  1. основи основ
  2. Невеликий відступ про російські літери
  3. Верхній регістр букв
  4. Пошук відповідності на початку рядка, символ ^
  5. Пошук відповідності кінця рядка. У чому відмінність між \ z і $
  6. Спеціальні символи (метасимволи)
  7. Квадратні дужки [ ]
  8. Фігурні дужки { }
  9. Крапка .
  10. Астеріск *
  11. плюс +
  12. Знак питання ?
  13. Круглі дужки () і пряма риса |
  14. Миша Рудрастих

Нарешті я добрався до цієї статті, в ній я спробую з нуля розповісти про регулярні вирази в 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. Модифікатори додаються в кінці шаблону, дивіться приклад:

&lt;? 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, ми повинні екранувати +.

&lt;? 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 ( &quot;/ 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-?