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

© Андрій Головін
http://exper.ural.ru/

До останнього часу для мене велічайщей загадкою і китайською грамотою представлялися загадкові "регулярні вирази" (regular experssions). Що ж це таке?

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

Найпростіше розібратися з їх влаштуванням на прикладах. Для цього можна використовувати спеціальні функції PHP для роботи з регулярними виразами (RE):

ereg();
ereg_replace();
eregi();
ereg_replacei();
split();

Функції з суфіксом i вдають із себе аналоги функцій без цього суфікса, не чувствтітельние до регістру операндів. Розглянемо, для початку, функцію split().

Виглядає вона так:

array split(string pattern, string string, int [limit]);.

Основним її параметром є pattern (Шаблон). У ньому міститься RE, для пошуку в рядку string. Ця функція будує масив на основі аналізу рядки, де роздільником є рядок, задана шаблоном.

Принцип роботи цієї функції на зрозумілій мові виглядає не так вже й страшно: Розбити рядок на компоненти (підрядка), відповідає правилам, описаних в параметрі pattern. Правило може виглядати, наприклад, так: Слова комами і будь-якою кількістю пропусків, причому прогалин може не бути. Це цілком "життєве" правило. На його основі можна побудувати масив ключових слів, що містяться в рядку і розділених комами, а після коми може йти будь-яку кількість прогалин (але не обов'язково). Тепер розглянемо як записати це правило в нотації RE.

, *

Кожен символ у шаблоні важливий. Зверніть увагу на пробіл між комою і зірочкою – це необхідний елемент шаблону. Перший символ означає обов'язкову кому після слова, а комбінація

 *

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

Розглянемо, як все це реалізувати на PHP за допомогою RE:

$str = "test, one, to, sree";
$regs = split(", *",$str);
for ($i = 0; $i <= count($regs)-1; $i++) {
echo $i," : ",$regs[$i];
}

І результат роботи даного коду:

0 : test
1 : one
2 : to
3 : sree

Причому, рядок $str може виглядати так: "test, one, to, sree", Або так: "test,one,to,sree", Або так: "test,one,   to, sree". Результат буде однаковим.

Перейдемо до більш складного прикладу з життя. Спробуємо визначити версію браузера з рядка $HTTP_USER-AGENT, Для Internet Explorer. Типова рядок виглядає так:

Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)

Спочатку спробуємо визначити правило вибірки номера версії звичайною мовою. Перед номером версії обов'язково йде комбінація символів "MSIE" і пробіл, закінчується номер версії крапкою з комою. Просто? Тепер запишемо це в термінах RE.

MSIE ([^;]+)

Як бачите, тут використовуються дужки різної конфігурації. Що вони означають? Круглі дужки визначають той елемент, який ми шукаємо в рядку (у нашому випадку - шаблон номера версії версії). Квадратні - Визначають набір символів, кожен з яких може складати частину номера версії. ^ - Є заперечення. Тобто конструкція

[^;]

в перекладі на російську означає "будь-який символ, крім точки з комою". + Після квадратних дужок каже, що таких символів (відмінних від;) повинно бути мінімум 1 (або більше). Круглі дужки позначають кордону шуканої підрядка. Відповідна шаблоном у круглих дужках підрядок зберігається в спеціальній змінній. Таким чином RE

MSIE ([^;]+)

перекладається на російську мову, як "всі символи, відмінні від крапки з комою, наступні за набором символів MSIE і пробілом".

Але нам необхідно отримати номер версії. Для цього існує функція ereg() (Або її регістронезавісімий аналог eregi()). Виглядає вона так:

int ereg(string pattern, string string, array [regs]);.

У параметрі pattern передається шаблон, в string - Рядок для розбору, а в параметрі regs передається масив знайдених підрядків, відповідних шаблоном у круглих дужках. Перший (з індексом 0) елемент масиву представляє собою підрядок, відповідну всьому шаблоном pattern. Якщо підрядок, відповідна шаблоном pattern не знайдена, то повертається значення false інакше, кількість знайдених підрядків.

У даному випадку виклик цієї функції буде виглядати так:

ereg("MSIE ([^;]+)",$HTTP_USER_AGENT,$regs);
echo "<B>$HTTP_USER_AGENT : $HTTP_USER_AGENT</B><BR>";
echo "<B>VERSION : $regs[1]</B>";

Ось результат роботи цього коду:

$HTTP_USER_AGENT : Mozilla/4.0 
(compatible; MSIE 5.0; Windows 98; DigExt)

VERSION : 5.0

Сподіваюся, основні принципи побудови RE зрозумілі? З усіма можливими модифікаторами і додатковими прикладами можна ознайомитися на відповідній сторінці

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*