Чер 24 2011
 

mysql_connect() — Відкриває з’єднання із сервером MySql.

Cинтаксис:

Resource mysql_connect (String mysqlHost, String MysqlUser, String MysqlPassword)

mysqlHost - URL що вказує на MySql cервер до якого потрібно під’єднатися.

MysqlUser – користувач MySql від імені якого буде працювати php-програма.

MysqlPassword – пароль користувача від імені якого буде працювати php-програма.

Повертає індентифікатор з’єднання із сервером MySql або false при невдалі спробі.

Виклик функції mysql_connect() повинен передувати будь-яким операціям із MySql. Індентифікатор з’єднання, який повертає функція у вигляді результату, може бути збережений у змінну, але це не обов’язкова вимога.

Приклад використання:



1
2
3











<?php












$connection





 





=





 





mysql_connect











(











"localhost"











,





 





"root"











,





 





"12345"











)











;












?>








mysql_query() — Надсилає MySql запит.

Cинтаксис:

Boolean|Resource  mysql_query ( String query [, Resource  link_identifier ] )

query -запит який буде надісланий MySql серверу.

link_identifier індентифікатор з’єднання із сервером MySql. Якщо не буде вказаний, то функція використає останній індентифікатор з’єднання що був відкритий функцією mysql_connect() .

Зазвичай усі виклики mysql_query() використовують наперед встановлений індентифікатор з’єднання і немає потреби щоразу його передавати у функцію.

Для запитів SELECT, SHOW, DESCRIBE, EXPLAIN та інших запитів що передбачають повернення результатів у вигляді результуючого набору, повертає ресурс який буде посиланням на цей результуючий набір, або повертає  FALSE якщо сталася помилка.

Для інших типів  SQL запитів, INSERT, UPDATE, DELETE, DROP, і тд.,  mysql_query() повертає  TRUE коли запит був успішно виконаний або  FALSE якщо сталася помилка.

Приклад використання:



1
2
3
4
5
6
7
8
9











<?php












$sql





 





=





 





"SELECT * FROM user"











;












//Повертає ресурс












$resource





 





=





 





mysql_query











(











$sql











)











;






 






$sql2





 





=





 





"UPDATE user SET user_name='Ivan' WHERE user_id='23'"











;












//Повертає булеве значення












$boolean











=





 





mysql_query











(











$sql2











)











;












?>








mysql_fetch_array() — Отримує запис із результуючого набору у вигляді ассоціативного масиву або числового масиву або обох.

Синтаксис:

Array mysql_fetch_array ( Resource  result [, int result_type = MYSQL_BOTH ] )

result  - посилання на ресурс який був отриманий в результаті виконання функції mysq_query().

result_type – константа яка визначає тип результуючого масиву. По замовчуванню функція повертає масив обох типів.

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

Приклад використання:



1
2
3
4
5
6
7
8











<?php












$sql





 





=





 





"SELECT user_id, user_name FROM user"











;












$resource





 





=





 





mysql_query











(











$sq











)











;












$array





 





=





 





mysql_fetch_array











(











$resource











)











;












/*
$array[0] і $array['user_id'] будуть містити одинакові значення
*/












?>








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

До змісту

Чер 24 2011
 

Команда DELETE видаляє записи із вказаної таблиці або таблиць які задовільняють умову вказану в запиті. Синтаксис команди DELETE виглядає наступним чином.

DELETE FROM tables WHERE conditions;

tables - таблиця або таблиці з яких треба видалити записи. При видаленні із кількох таблиць, їх потрібно перелічити через кому або використовувати оператор JOIN

conditions - логічна умова яка визначає фактор того чи будуть видалені записи. Умова може бути складеною із кількох частин. Оператори  AND та  OR, що відповідно означають “і” та “або”, використовуються для об’єднання кількох логічних умов в одну умову.

Наступний запит видалить усі записи в таблиці user які задовільняють умову ‘old’>30.

DELETE FROM user WHERE ‘old’>30;

До змісту

 

Чер 22 2011
 

MySql команда UPDATE , оновлює значення полів бази даних у вказані таблиці або кількох таблицях. Синтаксис команди  UPDATE виглядає наступним чином.

UPDATE  table_reference  SET col_name1=value1, col_name2=value2 . . .  WHERE condition

table_reference - таблиця або таблиці у яких потрібно оновити значення полів. При вказанні кількох таблиць, їх потрібно перелічити через кому.

col_name1=value1, col_name2=value2  - список імен та нових значень полів які підлягають оновленню. Окрім явно вказаних нових значень полів, в якості значень можна використовувати математичні вирази. Наприклад, col_name1=1+1 або  col_name1=col_name2*5 .

condition – логічна умова яку повинні задовільнити записи у базі даних, для того щоб їхні поля були оновлені. Умова може бути складеною із кількох частин. Оператори  AND та  OR, що відповідно означають “і” та “або”, використовуються для об’єднання кількох логічних умов в одну умову.

Наступний sql-запит оновить поля усіх записів таблиці у яких значення поля  city задовільнить умову  city=’Kiev’.

UPDATE  user SET city=’Ternopil’  WHERE city=’Kiev’;

Одним запитом ми замінли значення полів  city на Ternopil, але  тільки тих, у яких ці поля мали значення  Kiev.

До змісту

Чер 21 2011
 

Команда SELECT використовується для отримування даних із бази даних. Ця команда може отримувати дані одразу із кількох таблиць і може бути доповнена командою UNION , яка об’єднує вибірку двох  SELECT запитів в один результат. Найбільш поширений варіант цієї команди має наступний синтаксис:

SELECT fields FROM tables WHERE conditions;

fields - поля які потрібно вибрати. При виборі кількох полей, їх треба перелічити через кому. Якщо замість полей  поставити символ  * , будуть вибрані усі поля .

tables - таблиця або таблиці з яких буде здійснена вибірка даних. При виборі із кількох таблиць, їх потрібно перелічити через кому.

conditions - логічна умова яка визначає фактор потрапляння записів у базі даних в результат вибірки. Записи які задовільняють дану умову, потраплять у результат вибірки, інші записи не будуть вибрані. Умова може бути складеною із кількох частин. Оператори AND та OR, що відповідно означають “і” та “або”, використовуються для об’єднання кількох логічних умов в одну умову.

Наступний запит не вказує умову для вибірки результатів.  В результаті його виконання  будуть вибрані усі записи із вказаної таблиці або таблиць.

SELECT * FROM user;

Наступний запит  вибере усі поля із таблиці user у яких поле  old задовільняє умову old=’19′ або поле city задовільняє умову city=’Kiev’.

SELECT * FROM user WHERE old=’19′ OR city=’Kiev’;

Оператор AND вимагає задовільнення умови як справа та і зліва від нього. Наступний запит є модифікованим варіантом попереднього запиту. Замість оператора OR він використовую оператор   AND. В результаті виконання цього запиту будуть вибрані тільки ті записи, які задовільняють обидві умови що знаходяться зліва і справа від оператора  AND.

SELECT * FROM user WHERE old=’19′  AND city=’Kiev’;


До змісту

Чер 20 2011
 

MySql команда INSERT вносить новий рядок даних у існуючу таблицю. Існує кілька варіантів команди  INSERT, але у нашому уроці ми розглянемо один із найпростіших варіантів її використання. Синтаксис команди INSERT має наступний вигляд:

INSERT INTO tbl_name VALUES ();

Де  tbl_name є назвою таблиці в яку вносяться дані, а конструкція  VALUES () заповнюється явно вказаними, і роділеними через кому значеннями полів.

Наступний sql-запит вносить один рядок даних у таблицю phoneList.

INSERT INTO phoneList VALUES (’5′, ‘Bob’, ‘Nilson’, ‘nilson@cc.com’, ’7383116′);

Зверніть увагу!  При використанні цього варіанту команди  INSERT, ви маєте знати в якому порядку знаходяться поля у таблиці. Якщо ви переплутаєте порядок додавання значень у конструкцію  VALUES (), то це призведе до небажаного результату.

До змісту

Чер 20 2011
 

Дані являються настільки важливою частиною сучасного програмування, що цілі мови програмування повністю призначені для керування базами даних. Основним стандартом у мовах баз даних, є мова структурованих запитів ( Structured Query Language або SQL ). SQL є стандартизованою мовою, призначеною для створення баз даних, збереженя та отримання інформації із них. Існують спеціальні програми (Системи Керування Базами Даних або СКБД), призначенні для інтерпритації даних SQL та виконання різних операції з ними.

Зазвичай програмісти розпочинають із створення струкрури даних SQL, після чого створюють програму на інші мові програмування (наприклад php) для отримання доступу до цих даних. Існує багато систем керування базами даних, але система MySql найкраще адаптована для сумісної роботи із php.

Увага! Для повноцінного продовження уроку, у вас має бути встановлена система MySql. Завантажити дистрибютив MySql можна на офіційному сайті.

Працюємо з MySql

Існує декілька способів використання MySql, однак типова процедура полягає в наступному: з’єднання із сервером MySql, вибір потрібної бази даних, використання мови SQL для керування нею.

Консольний клієнт (MySql.exe), постачається із самою MySql, і є найбільш поширеним інструментом для роботи із базами даних MySql. Хоча ця програма не вражає інтерфейсом, вона надає низькорівневий доступ до баз даних.

Створюємо базу даних

Щоб продемонструвати основні поняття бази даних, я створю і перегляну простий список телефонів. Основна структура такого списку телефонів зображена у наступні таблиці.

id firstName lastName email phone
0 Robert harris robertharris@cs.com 9843569
1 John show johnshow@cs.com 7709923

id – ідентифікатор, firstName – ім’я, lastName – прізвище, email – емейл адрес, phone – телефон

Список телефонів, являє собою типову таблицю даних. Люди які створюють бази даних, дають спеціальні назви частинам таблиць у яких знаходяться дані, тому я використав цей список телефонів для їх ілюстрації. Кожен рядок у таблиці називається записом. Список записів називається таблицею. Усі записи таблиці містять одинакові елементи, що називаються полями (або ствопчиками). У всіх записів таблиці одинакове визначення полей, але самі поля можуть містити різні значення. Поля таблиць визначаються особливим чином. У зв’язку з тим, що таблиці баз даниз зберігаються у файлах, комп’ютер має точно знати скільки місця необхідно виділити для кожного поля, тому розмір і тип поля дуже важливі. У цій конкретній таблиці бази даних, визначено п’ять полей. Одне поле цілочисленого типу а усі інші містять строкові дані.

Приклад створення таблиці у базі даних test

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

USE test;

CREATE TABLE phoneList (

id INT PRIMARY KEY,

firstName varchar(15),

lastName varchar(15),

email varchar(25),

phone varchar(20)

);

Цей код є SQL скриптом. Він схожий на php-програму у тому сенсі, що він є набором інструкцій, які виконує комп’ютер. Інтерпритатор php не взаємодіє напряму із базою даних. SQL команди відсилаються інші програмі (у нашому випадку це СКБД Mysql), яка вміє працювати із базою даних. Так само як php-код створює html, що може бути інтерпритований браузером, ви будете створювати SQL-код що буде використовуватися інтерпритатором MySql.

Коли цей код буде надісланий програмі що підтримує бази даних SQL, то у базі даних із назвою « test » вона створить нову таблицю даних із назвою « phoneList ».

Використовуємо базу даних

Можлива ситуація, що ви будете працювати із різними базами даних у своїх проектах, що працюють із одною СКБД. Перед тим як почати працювати із базою даних, її потрібно активувати командою USE .

Якщо у вас ще немає бази даних, яку можна обрати за допомогою команди USE. Ви можете створити її за допомогою команди CREATE . Наприклад, для того щоб створити нову базу даних із назвою «MyStore», виконайте наступну команду.

CREATE DATABASE MyStore;

Після створення нової бази даних, ви можете обрати її наступною командою.

USE MyStore;

Створюємо таблицю phoneList

Для того щоб створити таблицю, вам потрібно вказати її назву а також назву усіх її полей.

Для кожно поля ви маєтете вказати тип даних, що будуть зберігатися в ньому. В якості прикладу, цей код демонструє створення таблиці phoneList.

CREATE TABLE phoneList (

id INT PRIMARY KEY,

firstName varchar(15),

lastName varchar(15),

email varchar(25),

phone varchar(20)

);

Рядок «CREATE TABLE phoneList» вказує що новостворена таблиця буде називатися phoneList. В круглих дужках, через кому, йде перелік полей таблиці. Опис кожного поля починається із його назви, за якою слідує тип поля. Наприклад, поле firstName varchar(15) буде називатися firstName, буде мати тип varchar (текстові дані), і максимальна кількість символів для зберігання у полі буде рівна 15. У настпуні таблиці вказані типи полей SQL, які використовуються найчастіше.

Тип даних Опис
INT Ціле число
CHAR(n) Текст що містить n символів
VARCHAR(n) Текст що містить n символів (цифр)
DATE Дата у форматі РРРР-ММ-ДД
TEXT Текст великого об’єму

Створюємо первинний ключ

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

id INT PRIMARY KEY

Більшість таблиць баз даних використовують це поле. Це спеціальне поле яке називається «первинний ключ».

З акінчуємо створення таблиці

Після того як ви вказали поля таблиці, закінчуємо опис закриваючою круглою дужкою і після цього виконати запит.

До змісту

Чер 17 2011
 

Використання сookies зручно як для програмістів, так і для користувачів. Користувачі виграють за рахунок того, що їм не доводиться щоразу заново вводити інформацію про себе, а програмістам сookies допомагають легко і надійно зберігати інформацію про користувачів.

Cookies – це текстові дані, що зберігаються на стороні клієнта, і містять пари “ім’я-значення”, з якими пов’язаний URL, за яким броузер визначає чи потрібно надсилати cookies на сервер.

Установка cookies

Установка cookies проводиться за допомогою функції setcookie :

setcookie()

Синтаксис:
BOOL setcookie ( string name [, string value [, INT Expire [, String Path [, String Domain [, INT Secure ]]]]] )

Ця функція має такі аргументи:

  • name – ім’я встановлюваного cookie;
  • value – значення, що зберігається в cookie з ім’ям name ;
  • expire – час в секундах з початку епохи-юнікс, по закінченні якого поточні cookie стають недійсними;
  • path – шлях, по якому доступний cookie;
  • domain – домен, з якого доступний cookie;
  • secure – директива, яка визначає, чи доступний cookie не по протоколу HTPPS. За замовчуванням ця директива має значення 0, що означає можливість доступу до cookie по звичайному протоколу HTTP.

Приклад простої програми з cookies

Давайте створимо простий сценарій, що підраховує за допомогою cookies кількість звернень відвідувача до сторінки.

У cookie з ім’ям counter буде зберігатися число відвідувань сторінки користувачем:



1
2
3
4
5
6











<?






  





$counter





 





=





 





$_COOKIE











[











'counter'











]











;











// Виймаємо їх із масиву глобального $_COOKIE






  





$counter











++;











//Збільшуємо на одиницю






  





setcookie





 





(











"counter"











,





 





$counter











)











;





 





//Записуємо нове значення у куки






  





echo





 





"Ви відвідали цю сторінку "











.











$counter











.











" раз"











;





 





//Виводимо результат












?>








Результат виконання сценарію на мал 16.1.
Результат виконання сценарію
Мал. 16.1 Демонстрація простої програми із використанням cookie

При роботі з cookies необхідно враховувати важливий момент, він полягає в тому, що cookie треба обов’язково встановлювати перед відправкою в броузер будь-яких заголовків ( будь-якої інформації що повинна відображатися на сторінці ), оскільки самі cookies встановлюються у вигляді заголовків. Тому якщо встановити cookies після якого-небудь тексту, що відправляється в броузер, виникне помилкова ситуація.

Розглянемо це питання детальніше, для чого змінимо попередній код, наведений у лістингу, помістивши перед установкою cookie текст:



1
2
3
4
5
6
7





Якщо тут помістити текст, то виникне помилка.






<?






  





$counter





 





=





 





$_COOKIE











[











'counter'











]











;











//Виймаємо їх із масиву глобального $_COOKIE






  





$counter











++;











//Збільшуємо на одиницю






  





setcookie





 





(











"counter"











,





 





$counter











)











;





 





//Записуємо нове значення у куки






  





echo





 





"Ви відвідали цю сторінку "











.











$counter











.











" раз"











;





 





//Виводимо результат












?>








Як видно на мал 16.2, при виконанні цього коду виводиться повідомлення про помилку:
Приклад невдалої спроби встановити куки.
мал. 16.2 Приклад невдалої спроби встановити куки.

Отримуємо значення cookie

Значення, що зберігається в cookie можна отримати через глобальний масив  $_COOKIE ["name"] .

Установка терміну придатності cookies

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

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

time()

Синтаксис:

INT time ( void )

Наступний код демонструє роботу функції time().



1
2
3
4











<?






  





$timestamp





 





=





 





time











(











)











;






  





echo





  





"Спочатку епохи лінукс минуло "











.











$timestamp











.











" секунд."











;












?>








Функція time()
Мал. 16.3 Демострація роботи функції time

Приклад встановлення терміну придатності cookie:



1
2
3
4











<?





 
  





/* цей cookie дійсний протягом 10 хв після створення */





 
      





setcookie











(











"name"











,





 





$value





 





,





 





time











(











)





 





+





 





600











)











;





 






?>








Видалення cookie

Видалити cookie просто. Для цього треба викликати функцію setcookie і передати їй ім’я того cookie, який підлягає видаленню:



1
2
3











<?php












setcookie











(











"name"











)











;












?>








Інші встановлені cookie при цьому не видаляються.

До змісту

Чер 16 2011
 

Сесії і куки (cookies) призначені для зберігання відомостей про користувачів при переходах між сторінками сайту. При використанні сесій дані зберігаються у тимчасових файлах на сервері. Файли з куками зберігаються на комп’ютері користувача, і за запитом відсилаються броузером сервера.

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

Протокол HTTP є протоколом “без збереження стану” . Це означає, що даний протокол не має вбудованого способу збереження стану між двома транзакціями. Тобто, коли користувач відкриває спочатку одну сторінку сайту, а потім переходить на іншу сторінку цього ж сайту, то грунтуючись тільки на засобах, що надаються протоколом HTTP неможливо встановити, що обидва запити відносяться до одного користувача. Виходячи із цієї особливості протоколу http, виникла потреба у створенні способу, за допомогою якого було б відстежувати інформацію про користувача протягом одного сеансу зв’язку з веб-сайтом. Одним з таких методів є управління сеансами (сесіями) за допомогою спеціально призначених для цього функцій. Для нас важливо те, що сеанс по суті, являє собою набір змінних, які, на відміну від звичайних змінних, зберігаються і після завершення виконання PHP-програми.

При роботі з сесіями розрізняють наступні етапи:

  • відкриття сесії
  • реєстрація змінних сесії і їх використання
  • закриття сесії

Відкриття сесії
Найпростіший спосіб відкриття сесії полягає у використанні функції session_start , яка викликається на початку PHP-сценарію:

session_start()

Синтаксис:
bool session_start ( void )

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

Реєстрація змінних сесії
Після ініціалізації сесії з’являється можливість зберігати інформацію в суперглобальному масиві $_SESSION . Наприклад, є файл index.php у якому в масив $_SESSION зберігається змінна і масив.









<?php






  





// Ініціюємо сесію






  





session_start











(











)











;






 
  





// Записуємо значення в сесію






  





$_SESSION











[











'name'











]





 





=





 





"value"





 





;






 
  





//Записуємо масив у сесію






  





$arr





 





=





 





array











(











"first"











,





 





"second"











,





 





"third"











)











;






  





$_SESSION





 





[











'arr'











]





 





=





 





$arr











;






 
  





//Виводимо посилання на іншу сторінку






 
  





echo





 





"<a href=
http://highlife.pp.ua/"





other





.





php





">інша сторінка</a>"





 





;












?>








На сторінках, де відбувається виклик функції session_start (), значення даних змінних можна витягти з суперглобальних масиву $_SESSION. У наступному прикладі коду приводиться вміст сторінки other.php, де беруться дані, раніше записані у сесію на сторінці index.php.









<?php





   






//Ініціюємо сесію   












session_start











(











)











;





   






//Виводимо вміст суперглобального масиву $_SESSION   












print_r











(





$ _SESSION





)











;





 






?>








Результат роботи скрипта виглядає наступним чином:

Array

(

[name] => value

[arr] => Array

(

[0] => first

[1] => second

[2] => third

)

)

Видалення даних сесії та її закриття
Після завершення роботи з сесією спочатку потрібно видалити всі змінні сесії, а потім викликати функцію session_destroy().

session_unset()

Синтаксис:
void session_unset ( void )

Функція session_unset видаляє усі змінні поточної сесії.

session_destroy()

Синтаксис:
bool session_destroy ( void )

Функція session_destroy закриває поточну сесію.

До змісту

Чер 16 2011
 

PHP підтримує два види запису регулярних виразів:POSIX і Perl. Perl та POSIX функції для роботи із регулярними виразами у php, виконують схожі дії. У цьому уроці ми розглянемо тільки один із видів, це регулярні вирази у стилі Perl.

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

/регулярний вираз/

За обмежувачами можуть слідувати модифікатори, уточнюючі регулярний вираз. Найбільш часто використовують такі модифікатори:

i – (Ігнорувати регістр при пошуку відповідності. Т. е. вираз “/mail/ i” буде відповідати як рядку “MAIL”, так і рядку “mail”.);
x – (Ігнорувати пробільні символи).

Для Perl-сумісних виразів характерне застосування загальних типів символів. Найбільш часто зустрічаються загальні типи символів наведено нижче.

\d – відповідає десяткової цифрі
\D – відповідає будь-якому символу, за винятком десяткових цифр
\s – відповідає пробільним символам
\S – відповідає будь-яким символам, крім пробільних
\h – наявність межі слова
\B – відсутність межі слова
\Z - кінець рядка або символ переводу рядка
\A – початок рядка

Тепер розглянемо основні функції, які є в PHP для роботи з PCRE-виразами.

preg_match ()

Синтаксис:
INT preg_match (String Pattern , String Subject [, Array Matches ] )


Ця функція шукає в рядку subject відповідність регулярному виразу pattern . Якщо встановлено необов’язковий параметр matches , то результати пошуку поміщаються в масив.
Наприклад:



1
2
3
4
5
6
7
8
9
10
11











<?






  





$str





 





=





 





"PHP одна із кращих мов програмування для Web"











;






  





if





 





(











preg_match





 





(











"/php/i"











,





 





$str











)











)





 
  





{






    





echo











(











"Відповідність знайдена"











)











;






  





}






  





else






  





{






    





echo











(











"Відповідність не знайдена"











)











;






  





}












?>








preg_replace()

Синтаксис:
Mixed preg_replace (Mixed Pattern , Mixed Replacement , Mixed Subject [, INT Limit ] )

Ця функція шукає в рядку subject відповідності регулярному виразу pattern , і замінює їх на replacement . Необов’язкового параметр limit задає число відповідностей, які треба замінити. Якщо цей параметр не вказаний, або дорівнює -1, то замінюються всі знайдені відповідності.

Наприклад:



1
2
3
4
5
6











<?






  





$str





 





=





 





"19 травня 1990"











;






  





$pattern





 





=





 





"/([0-9]{4})/i"











;






  





$replacement





 





=





 





"





$1





 року"











;





 





// /$1 посиалання на результат який був знайдений першими круглими дужками






  





print





 





preg_replace











(











$pattern











,





 





$replacement











,





 





$str











)











;












?>








preg_match_all()

Синтаксис:
int preg_match_all ( string $pattern , string $subject , array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]] )

Ця функція шукає в рядку subject всі співпадання із регулярним виразом  pattern і записує їх у масив  matches в порядку встановленому параметром  flags .

Наприклад:



1
2
3
4
5
6
7
8
9
10











<?












/* 
Цей приклад показує як за допомогою функції preg_match_all, можна шукати текст який знаходиться між тегами html.
*/






  





$str





 





=





 





"<div class=first>Перший блок</div><div class=second>Другий блок</div>"











;






  





preg_match_all











(











"#<[^>]+>([^<]*)</[^>]+>#"











,





 





$str











,





 





$res











,





 PREG_PATTERN_ORDER





)











;






  





//Масив  $res[0] буде містити усі співпадання цілого регулярного виразу






  





//Масив  $res[1] буде містити усі співпадання регулярного виразу у перших дужках.






  





print_r











(











$res











)











;





 






?>








До змісту

Чер 15 2011
 

Уявіть ситуацію: вам доручено перевірити вміст усіх сторінок на веб-сервері, і знайти в них два повторюваних слова «this this». Ваше рішення повинно:

  • Враховувати усі можливі розриви рядків і навіть допускати ситуацію, коли слово що знаходиться в кінці одного рядка, повторяється у наступному.
  • Находити повторювані слова не дивлячись на регістр символів (наприклад, «This this»).
  • Враховувати ситуацію коли між повторюваними словами може бути будь-яка кількість пробільних символів (пробіли, знаки табуляції, переведення рядків, та інших).
  • Находити повторювані слова які розділені тегами html.

Зараз ви можете сказати: «Нічого собі задачка!». Але ця задача є повністю реальна, і для реальних задач існують реальні рішення.

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

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

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

Метасимволи

Всі регулярні вирази складаються із звичайних символів та метасимволів. Погляньте на наступний вираз : ^ ( first | second ) song . У ньому символи ^ , (, ), та | відносяться до метасимволів, усі інші частини регулярного виразу є звичайними символами. В регулярних виразах метасимволи і звичайні символи, використовуються для досягнення бажаного результату. З іншого боку, якщо у регулярному виразі не використовуються метасимволи, то регулярний вираз перетворюється в «засіб простого пошуку». Наприклад, при пошуку виразу cat , будуть знайдені всі рядки які містять три розташовані підряд букви c a t . Навіть якщо ці букви будуть знаходитися всередині іншого слова, наприклад catrine , результат пошуку буде позитивний. Ви маєте розуміти що засоби, пошуку шукають не по словах, пошук здійснюється на рівні байтів, і він зазвичай не має ніякого уявлення про слова, речення, абзаци, та інші високорівневі концепції.

Початок та цінець рядка

Одними із найбільш простих метасимволів,  є метасимвол ^ (кришка) і $ (долар). Ці метасимволи представляють початок і кінець рядка що підлягає перевірці. Як писалось вище, регулярний вираз cat находить послідовно розташовані символи c a t , у будь-які позиції рядка, але для виразу ^ cat , співпадання відбувається лише в тому випадку, коли символи c a t знаходяться на початку рядка. Метасимвол ^ , фактично прив’язує слідуючу частину регулярного виразу до початку рядка. Аналогічно вираз cat$ , знаходить співпадання лише тоді, якщо символи c a t знаходяться в кінці рядка. Наприклад, вираз cat $ найде співпадання у рядку scat .

Символьні класи

Символьні класи дають можливість співпадання з одним символів із декількох можливих. Наприклад, ви хочете знайти рядок tray що може бути написаний як trey . За допомогою конструкції «[…]», що називається символьним класом, можна перечислити усі символи що можуть бути у дані позиції тексту. Вираз [ e ] співпаде тільки з буквою e, вираз [ a ] співпаде тільки з буквою a, але регулярний вираз [ ea ] співпаде у будь-якою із цих двох букв. Таким чимом, вираз tr [ ae ] y означає: «Найти символ t , за яким слідує символ r , за яким слідує символ a або e , і все це закінчується символом y » . Поза символьними класами передбачається, що перераховувані символи (наприклад t або r ) слідують один за другим – «найти співпадання із t за яким слідує співпадання із r ». В символьних класах логіка співпадання інша. Вміст символьного класу визначає список символів, з якими співпаде даний символ у регулярному виразі, тут передбачається вибір будь-якого символу вне залежності від його положення у символьному класі.

Кількість символів у символьному класі може бути будь-якою. Наприклад, клас [123456] співпаде із будь-якою із цих цифр. Цей клас входить у вираз < H [123456]>, що співпадає із послідовністю типу <H1>, <H2>, <H3> і так далі. Такий вираз може використовуватися при пошуку заголовків html .

Всередині символьного класу, метасимвол «-» (дефіс), означає інтервал символів. Регулярний вираз < H [1-6]> еквівалентний попередньому варіанту. Класи [0-9] та [ a- z] , зазвичай використовуються для пошуку цифр та символів нижнього регістру. Інтервали можна успішно комбінувати із звичайними символами. Наприклад, вираз [0-9 A- Z:!] співпаде із цифрою, буквою верхнього регістру, символом двох крапок ( : ), та знаком оклику (!).

Інвертовані символьні класи

Якщо замість конструкції [...], поставити конструкцію [^...], клас співпаде із будь-якими символами, що не входять в нього. Наприклад, вираз [^ 1-6] співпаде із будь-яким символом що не входить в інтервал від 1 до 6.

Зауважте що для інвертування класу, використовується той самий символ ^, який означає початок рядка. Так, символ насправді той самий, але всередині символьного класу у нього зовсім інша дія.

Один будь-який символ

Метасимвол « . » (крапка), являє собою скорочену форму запису символьного класу, що співпадає із будь-яким символом. Він використовується тоді, коли в декількох позиціях регулярного виразу може знаходитися будь-який символ. Наприклад, ви хочете знайти дату яка може бути записаня як  03/19/76 або 03-19-76. Звичайно ви можете побудувати регулярний вираз, який буде враховувати усі можливі символи що розділяють числа. Вираз 03[/-]19[/-]76 успішно впорається із цим завданням. За допомогою метасимвола « . », ми можемо написати простіший варіант попереднього виразу. Вираз 03.19.76 буде працювати аналогічним чином.

Вибір

Дуже зручний та корисний метасимвол « | », який означає «або». Цей метасимвол дозволяє об’єднати кілька регулярних виразів в одне, що буде співпадати із будь-яким із підвиразів з яких воно складається. Наприклад, Bob і Robert – два різних вирази, а вираз Bob | Robert – один регулярний вираз співпадаючий із будь-яким із цих рядків. Підвирази, об’єднанні даним способом, називаються альтернативами .

Давайте повернемося до нашого регулярного виразу tr [ ae ] y . Цікавим нюансом є той, що цей вираз можна записати як tray | trey і навіть tr ( a | e ) y . В останньому варіанті, круглі дужки відділяють конструкцію вибору від решти виразу (круглі дужки також являються метасимволами). У виразі tr ( a | e ) y круглі дужки нам необхідні, без них tra | ey буде означати tra або ey це не те що нам потрібно. Конструкція вибору діє лише всередині круглих дужок.

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

Квантифікатори (повторювачі)

В ситуації коли символ (або частина регулярного виразу) який ми шукаємо, повинен повторитися певну кількість разів, ми можемо просто записати його у регулярний вираз декілька разів. Наприклад, вираз baaac буде шукати символ b за яким слідує три одинакових символа a і все це закінчується символом c . Якщо кількість повторень символа або частини регулярного виразу буде великою, використовувати такий спосіб недоречно. Тим більше трапляються ситуації, коли точна кількість повторень певного символу невідома.

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

* – (зірочка) Вказує на те, що символ має повторюватися 0 або більше разів. Цей метасимвол треба розуміти наступним чином: «символ може бути відсутній, або він може бути присутній будь-яку кількість разів».

+ – (плюс) Вказує на те, що символ має повторюватися 1 або більше разів. Цей метасимвол треба розуміти наступним чином: «повинен бути хоча би один такий символ, або він може бути присутній будь-яку кількість разів».

? – (знак запитання) Вказує на те що символ може бути присутній один раз, або може бути відсутній. Цей метасимвол треба розуміти наступним чином: «символ може бути відсутній, або він може бути присутній один раз».

Давайте скористаємося отриманими знаннями, і побудуємо регулярний вираз для пошуку html тегів типу <HR SIZE=12>.  Цей тег виводить на екран горизонтальну лінію товщиною 12 пікселів. Давайте  врхазуємо варіанти написання цього тегу. Перед закриваючою кутовою дужкою (>), може бути невідома кількість пробілів. Також пробіли можуть бути з обох боків від знаку (=). І ми точно знаємо що після HR має бути мінімум один пробіл. В результаті ми приходимо до виразу « <HR +SIZE *=  *12 *> »  який враховує усі ці варіанти.

Визначення інтервалів та кількості екземплярів

Окрім квантифікаторів які описують відносні кількісні характеристики символів, в регулярних виразах є спосіб явно вказати яку кількість раз має бути присутнім певний символ (або частина регулярного виразу). Конструкція «{мінімум, максимум}» називається інтервальним квантифікатором. Наприклад, вираз за яким слідує {3,15} може співпасти до 15 разів, якщо це можливо, але він може обійтися і трьома співпаданнями. Якщо у інтервальному квантифікаторі  не вказується максимум, то в даному випадку максимальна кількість повторень не передбачається і може бути будь-якою. Запис {0,1} еквівалентний метасимволу «?», а запис {0,} еквівалентний метасимволу «*».

Для того щоб поширити дію квантифікаторів більш ніж на один символ, або на окрему частнину регулярного виразу, нам потрібно заключити потрібну частину у круглі дужки. Вираз «(from:)?sender@yandex.ru» вказує що ціла послідовність from: може передувати емейл-адресу відправника, або може бути відсутньою.

Круглі дужки та зворотні посилання

До цього моменту ми зустрічалися із двома випадками використання круглих дужок: для обмеження зони дії конструкції вибору ( tr(a|e)y ) та групування символів для застосування квантифікаторів до них (наприклад, (from:)?sender@yandex.ru). Цими варіантами застосування не обмежуються можливості круглих дужок.

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

Більшість програмних засобів підтримують механізм « зворотніх посилань ». Якщо круглі дужки знайши співпадання із підвиразом що знаходиться всередині них, то спеціальний метасимвол « \1 » представляє цей текст (яким би він не був на той момент) у подальші частині регулярного виразу. За допомогою механізму зворотніх посилань, ми можемо посилатися на текст що був співпавший із виразом у круглих дужках.

Ми також можемо використовувати декілька пар круглих дужок у наших регулярних виразах. В такому випадку посилання на співпавший з ними текст будуть мати вигляд «\1», «\2», «\3» і тд. Наприклад, у виразі « ( [0-9])([ a- z])/1/2 » метасимвол /1 буде посилатися на текст співпавший з першими круглими дужками, а метасимвол /2 буде посилатися на на текст співпавший з другими круглими дужками.

Механізм зворотніх посилань зручно використовувати коли ми ще не знаємо що саме будемо шукати. Наприклад, вираз « ([ a - z ])/1 » треба розуміти наступним чином: «якщо знайшов букву в діапазоні від a до z, пошукай її знову».

Екранування

Яким чином додати до шуканих символів символ, який зазвичай інтерпритується як метасимвол? Наприклад, в процесі пошуку доменного імені new.ukraine.com по регулярному виразу « www. example. com », в результати пошуку потраплять рядки типу newssukrainescom. Пригадайте що метасимвол «.» співпадає із будь-яким символом.

Метапослідовність яка співпадає із символом крапки, склаєтьс із звичайної крапки і передуючого їй префікса « \ » (зворотній слеш). Послідовність « \. » називається екранованою (escaped) крапкою. Для того щоб побудувати правильний регулярний вираз для пошуку доменного імені, усі крапки що входять у назву домена, повинні бути екрановані (наприклад, new\.ukraine\.com ).Екранування можна застосовувати для будь-яких метасимволів.

До змісту