Наш ассоциированный член www.Bikinika.com.ua

Використання регулярних виразів з PHP

Регулярні вирази є потужним інструментом для вивчення та зміни тексту. Самі регулярні вирази, що мають загальну позначку шаблону майже як мова міні-програмування, дозволяють описати і розібрати текст. Вони дозволяють шукати шаблони в рядку, витягуючи збіги гнучко і точно. Однак, слід зазначити, що оскільки регулярні вирази є більш потужними, вони також є більш повільними, ніж більш основні рядкові функції. Ви повинні використовувати регулярні вирази, якщо у вас є особлива потреба.

Цей підручник дає короткий огляд основного синтаксису регулярних виразів, а потім розглядає функції, які надає PHP для роботи з регулярними виразами.

PHP підтримує два різних типи регулярних виразів: POSIX-розширені та Perl-сумісні регулярні вирази (PCRE). Функції PCRE є більш потужними, ніж POSIX, і теж швидше, тому ми зосередимося на них.

У регулярному виразі більшість символів відповідають лише собі. Наприклад, якщо ви шукаєте регулярний вираз "foo" у рядку "Джон грає у футбол", ви отримуєте відповідність, тому що "foo" відбувається в цьому рядку. У звичайних виразах деякі символи мають спеціальне значення. Наприклад, знак долара ($) використовується для узгодження рядків, які закінчуються даним шаблоном. Аналогічно, символ каретки (^) на початку регулярного виразу вказує, що він повинен збігатися з початком рядка. Символи, які відповідають собі, називаються літералами. Символи, які мають спеціальні значення, називаються метасимволами.

Метасимвол крапки (.) Збігається з будь-яким символом, окрім нового рядка (\ t Отже, шаблон ht відповідає шапці, hothit, hut, h7t і т.д. Вертикальний метасимвол (|) використовується для альтернатив у регулярному виразі. Він веде себе так само, як логічний оператор АБО, і ви повинні використовувати його, якщо ви хочете побудувати шаблон, який відповідає більш ніж одному набору символів. Наприклад, зразок штату Юта | Айдахо | Невада відповідає рядкам, які містять "Юту" або "Айдахо" або "Неваду". Дужки дають нам можливість групувати послідовності. Наприклад, (Nant | b) ucket збігається з "Nantucket" або "bucket". Використання дужок для групування символів для чергування називається групуванням.

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

Щоб вказати набір прийнятних символів у вашому шаблоні, ви можете або побудувати клас символів, або скористатися попередньо визначеним. Клас символів дозволяє представляти купу символів як окремий елемент у регулярному виразі. Ви можете створити свій власний клас символів, уклавши прийнятні символи в квадратні дужки. Клас символів відповідає будь-якому з символів класу. Наприклад, клас символів [abc] відповідає a, b або c. Щоб визначити діапазон символів, просто вставте перший і останній символи, розділені дефісом. Наприклад, щоб відповідати всім алфавітно-цифровим символам: [a-zA-Z0-9]. Ви також можете створити клас символу, який не відповідає будь-якому символу, який не входить до класу. Для створення класу символів з відхиленням починається клас символів з ^: [^ 0-9].

Метасимволи +, *,? І {} впливають на число збігів, які повинні виконуватися шаблоном. + означає "Збіг одного або більше з попереднього виразу", * означає "Збіг нуля або більше з попереднього виразу", і? означає "збігається з нулем або одним з попереднього виразу". Фігурні дужки {} можна використовувати по-різному. З єдиним цілим числом, {n} означає "збігаються точно n входжень попереднього виразу", з одним цілим числом і комою, {n,} означає "збігаються n або більше входжень попереднього виразу", а з двома розділеними комами цілі числа {n, m} означають "збігаються з попереднім символом, якщо воно відбувається принаймні n разів, але не більше m раз".

Тепер подивіться на приклади:

Звичайний вираз буде відповідати ... foo Рядок "foo" ^ foo "foo" на початку рядка foo $ "foo" в кінці рядка ^ foo $ "foo", коли він знаходиться на рядку [abc ] a, b або c [az] Будь-яка маленька літера [^ AZ] Будь-який символ, який не є великою літерою (gif | jpg) Відповідає або "gif", або "jpeg" [az] + Одна або кілька малих літер [0 -] Будь-яке число, крапка або знак мінус ^ [a-zA-Z0-9 _] {1,} $ Будь-яке слово з принаймні однієї літери, числа або _ ([wx]) ([yz]) ) wy, wz, xy або xz [^ A-Za-z0-9] Будь-який символ (не число або буква) ([AZ] {3} | [0-9] {4}) Відповідає трьом літерам або чотири числа

Регулярні вирази, сумісні з Perl, імітують синтаксис Perl для шаблонів, що означає, що кожен шаблон повинен бути укладений у пару роздільників. Зазвичай використовується символ косої риски (/). Наприклад, / pattern /.

Функції PCRE можна розділити на кілька класів: узгодження, заміна, розбиття і фільтрація.

Повернутися до початку

Функція preg_match () виконує відповідність шаблону стилів Perl на рядку. preg_match () приймає два основних і три необов'язкових параметра. Ці параметри є, по порядку, рядком регулярного виразу, вихідним рядком, змінною масиву, що зберігає збіги, аргументом прапорця і параметром зміщення, які можна використовувати для визначення альтернативного місця, з якого слід почати пошук:

preg_match (шаблон, предмет [, відповідності [, прапори [, зміщення]]])

Функція preg_match () повертає 1, якщо знайдено відповідність, і 0 в іншому випадку. Давайте шукаємо рядок "Hello World!" для літер "ll":

<? php
if (preg_match ("/ ell /", "Hello World!", $ matches)) {
echo "Знайдено відповідність <br />";
echo $ match [0];
}
?>

Букви "ll" існують у "Hello", тому preg_match () повертає 1, а перший елемент змінної $ matches заповнюється рядком, який відповідає шаблону. Регулярний вираз у наступному прикладі шукає літери "ell", але шукає їх з наступними символами:

&lt;? php
if (preg_match ("/ ll. * /", "Історія Хеллоуїна", $ match)) {
echo "Знайдено відповідність <br />";
echo $ match [0];
}
?>

Тепер давайте розглянемо більш складний приклад. Найбільш популярним є використання регулярних виразів. Наведений нижче приклад перевіряє, чи є пароль "сильним", тобто пароль повинен містити не менше 8 символів і повинен містити принаймні одну літеру, одну літеру і одну цифру:

&lt;? php
$ password = "Fyfjk34sdfjfsjq7";
if (preg_match ("/^.* (? =. {8,}) (? =. * d) (? =. * [az]) (? =. * [AZ]). * $ /", $ password)) {
echo "Ваші паролі сильні.";
} else {
echo "Ваш пароль слабкий.";
}
?>

^ І $ шукають щось на початку і в кінці рядка. Комбінація ". *" Використовується як на початку, так і на кінці. Як згадувалося вище, метасимвол. (Точка) означає будь-який буквено-цифровий символ, а * метасимвол означає "нуль або більше". Між є групування в дужках. Комбінація "? =" Означає "наступний текст повинен бути таким". Ця конструкція не захоплює текст. У цьому прикладі, замість того, щоб вказувати порядок, що речі повинні з'являтися, він говорить, що він повинен з'явитися, але ми не стурбовані цим порядком.

Перша групування (? =. * {8,}). Це перевіряє, чи є щонайменше 8 символів у рядку. Наступна групування (? =. * [0-9]) означає "будь-який буквено-цифровий символ може статися нуль або більше разів, тоді може статися будь-яка цифра". Таким чином, це перевіряє, чи є щонайменше одне число в рядку. Але оскільки рядок не захоплюється, одна цифра може з'явитися в будь-якому місці рядка. Наступні групування (? =. * [Az]) і (? =. * [AZ]) шукають нижній регістр і верхній регістр у будь-якому місці рядка.

Нарешті, ми розглянемо регулярні вирази, які підтверджують адресу електронної пошти:

&lt;? php
$ email = [email protected];
$ regexp = "/ ^ [^ 0-9] [A-z0-9 _] + ([.] [A-z0-9 _] +) * [@] [A-z0-9 _] + ([.] [ A-z0-9 _] +) * [.] [Az] {2,4} $ / ";
if (preg_match ($ regexp, $ email)) {
echo "Адреса електронної пошти дійсна.";
} else {
echo "Адреса електронної пошти <u> не </u> є дійсною.";
}
?>

Цей регулярний вираз перевіряє номер на початку, а також перевіряє декілька періодів у імені користувача та доменному імені в адресі електронної пошти. Спробуємо самостійно дослідити цей регулярний вираз.

З причин швидкості функція preg_match () відповідає тільки першому шаблону, який він знаходить у рядку. Це означає, що дуже швидко можна перевірити, чи існує шаблон у рядку. Альтернативна функція, preg_match_all () , відповідає шаблону відносно рядка стільки разів, скільки дозволяє шаблон, і повертає кількість разів, до яких вона співпала.

Повернутися до початку

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

preg_replace (шаблон, заміна, тема [, ліміт])

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

&lt;? php
echo preg_replace ("/ ([Cc] opyright) 200 (3 | 4 | 5 | 6) /", "$ 1 2007", "Copyright 2005");
?>

У наведеному вище прикладі ми використовуємо зворотні посилання в рядку заміни. Посилання назад дозволяють використовувати частину відповідного шаблону в рядку заміни. Щоб скористатися цією функцією, необхідно скористатися дужками для перенесення всіх елементів регулярного виразу, які ви можете використовувати. Ви можете посилатися на текст, що відповідає підшару, зі знаком долара ($) і номером підшару. Наприклад, якщо ви використовуєте підматеріали, $ 0 встановлюється на весь матч, то $ 1, $ 2 і так далі встановлюються на окремі збіги для кожного підшаблону.

У наступному прикладі ми змінюємо формат дати з "yyyy-mm-dd" на "mm / dd / yyy":

&lt;? php
echo preg_replace ("/ (d +) - (d +) - (d +) /", "$ 2 / $ 3 / $ 1", "2007-01-25");
?>

Ми також можемо передавати масив рядків як предмет, щоб зробити заміну на всіх з них. Щоб виконати декілька замін на одному рядку або масиві рядків з одним викликом preg_replace () , ми повинні передати масиви шаблонів і замін. Погляньте на приклад:

&lt;? php
$ search = array ("/ (w {6} s (w {2}) s (w +) / e",
"/ (d {4}) - (d {2}) - (d {2}) s (d {2}: d {2}: d {2}) /");
$ replace = array ('"$ 1" .strtoupper ("$ 2") ",
"$ 3 / $ 2 / $ 1 $ 4");
$ string = "Написав John | 2007-02-15 02:43:41";
echo preg_replace ($ пошук, $ replace, $ string);?>

У наведеному вище прикладі ми використовуємо іншу цікаву функціональність - можна сказати PHP, що відповідний текст повинен бути виконаний як PHP-код, як тільки відбудеться заміна. Оскільки ми додали "e" до кінця регулярного виразу, PHP виконає заміну, яку він робить. Тобто, він візьме strtoupper (name) і замінить його результатом функції strtoupper () , яка є NAME.

Повернутися до початку

Функція preg_split () PHP дозволяє розбивати рядок на основі чогось більш складного, ніж буквальна послідовність символів. Коли потрібно розділити рядок з динамічним виразом, а не фіксованим, ця функція виручається. Основна ідея така ж, як preg_match_all (), за винятком того, що замість того, щоб повертати зібрані частини тематичного рядка, вона повертає масив частин, які не відповідають вказаному шаблону. У наступному прикладі використовується регулярний вираз для поділу рядка будь-якою кількістю коми або символів пробілу:

&lt;? php
$ keywords = preg_split ("/ [s,] + /", "php, регулярні вирази");
print_r ($ ключові слова);
?>

Ще одна корисна функція PHP - це функція preg_grep (), яка повертає ті елементи масиву, які відповідають заданому шаблону. Ця функція проходить через вхідний масив, перевіряючи всі елементи на пропонований шаблон. Якщо знайдено відповідність, відповідний елемент повертається як частина масиву, що містить всі збіги. У наступному прикладі виконується пошук через масив і всі імена, які починаються з літер AJ:

&lt;? php
$ names = масив ('Andrew', 'John', 'Peter', 'Nastin', 'Bill');
$ output = preg_grep ('/ ^ [am] / i', $ імена);
print_r ($ output);
?>

Повернутися до початку

Метасимволи +, *,?
Означає "Збіг одного або більше з попереднього виразу", * означає "Збіг нуля або більше з попереднього виразу", і?
Комбінація "?
Lt;?

Новости