ГоловнаКаталогБлогРейтингЕ-Пошта 
 
 
Зробити домашньою у вибране  

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

Вступ - про регулярні вирази
ereg
ereg_replace
eregi
eregi_replace
split
sql_regcase


Вступ - про регулярні вирази

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

Якщо вас цікавлять гривни, то знаходьте їх у текстах таким чином:
гривн[яаіи] - знайде слова гривня, гривня, гривні та гривни, бо квадратні дужки є вказівкою вибору одної букви.

Якщо написати
==гривн[яаіи]х?
то слова гривнях, гривнах теж будуть знайдені, бо позначка ? у регулярних виразах означає, що попереднє може з'явитися один раз, а може і не з'явитися.

Окрім ? є інші вказівки повторення
+ може з'явитися один чи більше разів.
* може не з'явитися чи з'явитися будь-яку кількість раз

Нам це треба, бо нащо оте слово гривни, якщо не показані слова поруч.
Тож пишемо:
==^.*гривн[яаіи]х?.*$

та отримуємо усі рядки, де є слова гривня, гривна, гривні, гривни, гривнях, гривнах, бо
^ - означає початок рядка
. - будь-який символ, що може бути перед чи після гривн[яаіи]х
* - цих символів може не бути, чи бути скільки завгодно
$ - кінець рядка.

Щоб відшукати також і слово грн пишемо:
==(гривн[яаіи]х?)|(грн)
бо | це вказівка альтернативи.

Можна було б однією цією вказівкою вказати усі слова:
==(грн)|(гривня)|(гривна)|(гривні)|(гривни)|(гривнях)|(гривнах)

Але могутнім чаклуном так не станеш. Могутні чаклуни пишуть:
==гри?в?н([яаіи]х?)?
Воно означає теж саме, зате чаклунські навички поглиблює.

Хоч американське нам чуже, та цуратись доларів не слід. Щось таке нам і класики казали.

Знак долара вже використовується для означення кінця рядка, тож щоб позбути його цій властивості поставимо перед ним зворотну похилу \.
Взагалі усі службові символи, а саме ^.[$()|*+?{\ втрачають свою службовість та стають звичайними символами, якщо перед ними зворотна похила. А у вказівці вибору більшість із них службового значення і не мають.

Коли йдеться про долари, то бажана не балаканина, а конкретні цифри, тож крапка, що позначає будь-який символ - це не те, що зараз треба. Краще, коли поруч із $ стоять цифри, тож пишемо:
[0-9]+\$

Це означає:
[0-9] - будь-яка цифра від 0 до 9
+ від одного до будь-якої кількості раз
\$ - а затим позначка долара.

Хтось пише $ перед цифрами, схопимо це альтернативою |.
([0-9]+\$|\$[0-9]+)

Та й замінено гривни доларами у виразі, що бере весь рядок.
^.* ([0-9]+\$|\$[0-9]+).*$

Щоправда, якщо ви пишете у PHP, то долар треба захистити двома зворотними похилими \\$, бо приховає. Дуже вже ця мова розумна.

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


ereg

ereg - Шукає збіги з регулярним виразом

Опис:

int ereg(string zrazok, string string, array [zbig]);

У рядку string шукає збіги з регулярним виразом, указаним у zrazok.

Пошук чутливий до регістру.

Функція повертає true, якщо у рядку string найдений збіг із zrazok, чи false, якщо збігу не було чи виникла помилка.

Якщо частини регулярного виразу взяти у дужки та викликати функцію з третім параметром regs, то збіги з частинами виразу збережуться у елементах масиву regs.

У $zbig[0] буде частина рядка string, що збіглася з усім виразом.
У $zbig[1] буде збіг із частиною виразу,що починається з першої лівої дужки;
У $zbig[2] буде збіг із частиною виразу,що починається з другої лівої дужки та т.д.
Якщо збігу з усім виразом не відбулося, то зміст $regs не зміниться.

Наприклад, якщо
ereg("1(23(45)67)8(9)ab", "zzz123456789abzzz", $zbig);
то
zbig[0] = 123456789ab
zbig[1] = 234567
zbig[2] = 45
zbig[3] = 9
zbig[4] =

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

Наступний код відшукує дату у ISO форматі та покаже її у форматі ДД.ММ.РРРР:

$date = "дата є 2001-03-04";
if ( ereg( "([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $date, $regs ) ) {
    echo "$regs[3].$regs[2].$regs[1]";
} else {
    echo "Нема дати за зразком РРРР-ММ-ДД у рядку: $date";
}

Ще приклади:

ereg("abc",$string);
/* Поверне true, якщо "abc" є у $string. */

ereg("^abc",$string);
/* Поверне true, якщо "abc" стоїть на початку рядка $string. */

ereg("abc$",$string);
/* Поверне true, якщо "abc" стоїть у кінці рядка $string. */

ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)", $string, $regs);
/* Розмістить у $regs[1], $regs[2] та $regs[3] три слова, які відокремлені пробілом. */

Приклади регулярних виразів:

Перевірить правильність email адреси, наприклад, abc.def.user@eee.ghi.host.com:
[a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)+

Перевірить правильність email адреси з іменем, наприклад, "Joe Doe" :
(\"?[a-zA-Z]+\"?[ \t]*)+\<[a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)+\>

Перевірить правильність протоколу, наприклад, htpp://, ftp:// or https://
[a-z]+://

Перевірить правильність числа з крапкою, наприклад, 1.2 та 0.5:
-?[0-9]+\.[0-9]+

Також див.:
eregi(), ereg_replace(), та eregi_replace().


ereg_replace

ereg_replace - заміняє рядочки, що збігаються з регулярним виразом

Опис:

string ereg_replace(string zrazok, string zamina, string string);

Ця функція відшукує у рядку string збіги з регулярним виразом zrazok та міняє ці збіги на zamina. Функція повертає змінений рядок string. (Тобто поверне первісний рядок, якщо не було збігів).

Наприклад:

$zrazok ="[чЧ][оО][рР][тТ]";
$zamina = "янгол";
$bulo = "Де його чорти взяли";
echo "було: $bulo <br>";
$nove = ereg_replace($zrazok, $zamina, $bulo);
echo "нове: $nove <br>";

Оглядач покаже:

було: Де його чорти взяли
нове: Де його янголи взяли

Якщо zrazok містить рядочки у дужках, то zamina може містити рядочки виду \\цифра. Замість цих рядочків функція підставить текст, що збігся з виразом у дужках. \\0 підставить увесь збіг зі zrazok.

Наприклад:

$zrazok ="(кращий)";
$zamina = "\\0 най\\1";
$bulo = "Він кращий";
echo "було: $bulo <br>";
$nove = ereg_replace($zrazok, $zamina, $bulo);
echo "нове: $nove <br>";

Оглядач покаже:

було: Він кращий
нове: Він кращий найкращий

Можна використовувати до 9 рядочків із дужками.
Якщо дужки вкладені, то їх номер рахують за відкривними дужками.

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

$str_from_file = "Севастополь - город русской славы";
$zrazok ="(.*)( русской )(.*)";
$zamina = "\\1 украинской \\3";
$bulo = $str_from_file;
echo "було: $bulo <br>";
$nove = ereg_replace($zrazok, $zamina, $bulo);
echo "нове: $nove <br>";

Оглядач покаже:

було: Севастополь - город русской славы
нове: Севастополь - город украинской славы

Ще приклади:

$string = ereg_replace("^","<BR>,$string);
/* Вставить вказівку <BR> на початку рядка. */

$string = ereg_replace("$","<BR>",$string);
/* Вставить вказівку <BR> у кінці рядка. */

$string = ereg_replace("\n","",$string);
/* Вилучить символ повернення каретки у рядку $string. */

Також див.:
ereg(), eregi() та eregi_replace().


eregi

eregi -- нечутливий до регістра пошук збігів із регулярними виразами

Опис:

int eregi(string zrazok, string string, array [zbig]);

Ця функція така ж як
ereg(), за винятком того, що вона ігнорує різницю у регістрах букв.

Також див.: ereg(), ereg_replace() та eregi_replace().


eregi_replace

eregi_replace - заміняє рядочки без уваги до регістра

Опис:

string eregi_replace(string zrazok, string zamina, string string);

Ця функція така ж як
ereg_replace(), за винятком того, що вона ігнорує різницю у регістрах букв.

Також див.: ereg(), eregi() та ereg_replace().


split

split - Розкладає рядок в елементи масиву за регулярним виразом

Опис:

array split(string zrazok, string string, int [limit]);

Повертає масив рядочків, що були відокремлені у рядку string символами, що збігаються з zrazok. Якщо виникне помилка, функція поверне false.
Слід пам'ятати, що zrazok чутливий до регістру.

Щоб отримати перші 5 полів із рядка у /etc/passwd: Приклад 1. split()

$passwd_list = split( ":", $passwd_line, 5 );

Щоб отримати частини дати, які виділені символами слешу, крапки або дефісу: Приклад 2. split()

$date = "04/30/1973"; // роздільники - символи слешу, крапки або дефісу
list( $month, $day, $year ) = split( '[/.-]', $date );
echo "Month: $month; Day: $day; Year: $year<br>\n";

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

Якщо ви бажаєте розбивати за символами, що є службовими у регулярних виразах, уникайте їх службовісті за допомогою зворотної похилої. Якщо вам здається, що функція робить щось не так, будь ласка, дивіться файл regex.7

Також див.: explode() та implode().


sql_regcase

sql_regcase -- Робить регулярний вираз нечутливим до регістру букв.

Опис:

string sql_regcase(string string);

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

Приклад 1. sql_regcase()

echo sql_regcase( "Foo bar : * ! ; % Єїі" );

Оглядач покаже:

[Ff][Oo][Oo] [Bb][Aa][Rr] : * ! ; % [Єє][Її][Іі]

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




  Логін:
  Пароль:
Книга Фріланс на західному ринку
Книга Фріланс на західному ринку

APServer | SiMan CMS | Лічильник відвідувань | Тека сайтів | Рейтинг | Форум | Download | Шаблони сторінок | Посібник Smarty | Підручник PHP | Статті/Огляди