Лекція № 13 Тема: Операції над рядками. Робота з датою та часом План Рядки в РНР Базові функції для роботи з рядками Робота з датою і часом Рядки в РНР Рядок — це самий універсальний об'єкт в світі РНР. Дуже часто рядки містять числа (як цілі, так і речовинні). Причому РНР дозволяє працювати з такими рядками, як із звичайними числами. Ми можемо «упакувати» в рядок будь-який об'єкт, наприклад, масив і працювати з ним, як з рядком. Як це зробити і для чого це потрібно, ви дізнаєтеся в найостаннішому пункті цього розділу. Те, що РНР лояльно відноситься до різних типів — це тільки його заслуга (точніше, розробників). Чим же хороші самі рядки в РНР? На відміну від С, переваги PHP-рядків полягають в наступному: Рядок може містити будь-які символи. Нагадаю, що рядок не може містити символи з кодом 0, оскільки перший такий символ трактується, як кінець рядка. Рядок може містити довільну кількість символів. Довжина рядка обмежується тільки об'ємом оперативної пам'яті, що дозволяє читати в рядок цілі файли і працювати з ними, як із звичайними рядками, наприклад, порівнювати. Базовими операціями над рядками є: Конкатенація рядків (приєднання одного рядка до іншої). Порівняння рядків. Конкатенація рядків У інших мовах програмування, наприклад, мові Pascal, для конкатенації (приєднання) рядків використовується символ «+». Проте в РНР використання оператора «+» некоректно: якщо рядки містять числа, то замість об'єднання рядків, буде виконана операція складання двох чисел. Розглянемо наступний лістинг : Лістинг. Використання оператора «+» для конкатенації рядків <? $а = "20"; $b = "10"; $с = $а + $b; // число + число echo "?c\n"; // виведе 30 $d = "Hello"; $с = $а + $d; // число + рядок echo "$c\n"; // виведе 20 ($а)?> Як бачите, для конкатенації рядків оператор «+» не підходить. Замість нього слід використовувати оператора «.» (крапка) — див. лістинг 9.2. Лістинг. Коректна конкатенація рядків <? Sa = "20"; $b = "10"; $с = $a.$b; // число + число echo "$c\n"; // виведе' 2010 $d = "Hello"; $с = $a.$d; // число + рядок echo "$c\n"; // виведе 20Hello ?> Порівняння рядків Подібна ситуація з перетворенням типів відбувається і при порівнянні рядків. Оператори порівняння == і != вимагають перетворення типів. Тому вони не повинні використовуватися для порівняння рядків (див. лістинг 9.3). | Лістинг. Порівняння рядків <? $а = 0; $b = 1; if ($а == "") echo "а - порожній рядок"; if ($b == "") echo "b - порожній рядок"; ?> Даний сценарій повідомить нас, що $а — це порожній рядок. Зв'язано це з тим, що порожній рядок "", перш за все, трактується як 0, а тільки потім — як «порожньо». У PHP операнди порівнюються, як рядки, тільки в тому випадку, якщо обидва вони — рядки. Інакше вони порівнюються, як числа. При цьому будь-який рядок, який інтерпретатору не вдасться перевести в число (у тому числі і порожній рядок), сприйматиметься, як 0. Можна придумувати деякі обхідні шляхи (брати числа в лапок, щоб вони сприймалися, як рядки, і т.п.), але при цьому дуже висока вірогідність виникнення помилок. Краще всього при порівнянні використовувати === (потрійний оператор рівності — оператор еквівалентності). Цей оператор завжди дозволяє проводити коректно порівняння, оскільки він порівнює величини і по значенню, і за типом. Примітка. Для порівняння рядків можна також використовувати функцію strval(), проте вона володіє певними обмеженнями і особливостями, що робить її використання небажаним. Тому дана функція, починаючи з PHP 4, вже не використовується. Базові функції роботи з рядками Функція strlen() повертає довжину рядок, тобто кількість символів, яка містить рядок. $а = "Hello"; echo strlen($a); // виведе 5 Функція strpos() шукає підрядок в рядку. Функції потрібно передати три параметри: Рядок, в якому ми шукатимемо підрядок. Підрядок. Позицію, починаючи з якої ми шукатимемо. Даний параметрнеобов'язковий і за умовчанням рівний 0 (початок рядка). Якщо рядок не знайдений, функція повертає false, інакше — номер позиції, з якою починається входження підрядка в рядок: echo strpos("Hello","el"); // виведе 1 При роботі з даною функцією дуже програмісти, що часто починають, припускаються однієї і тієї ж помилки. Коли я вивчав PHP, я не був виключенням з даного правила. А помилка полягає в наступному. Припустимо, що нам потрібно знайти підрядок ab в рядку abba: if(strpos("abba","ab")!=false) echo "Рядок ab є в abba"; Очевидно, наш сценарій повинен вивести рядок "Рядок ab є в abba". Проте він нічого не виводить! Річ у тому, що входження рядка ab в рядок abba починається з нульової позиції, а 0 і false при використанні оператора порівняння != є синонімами. Правильніше буде написати так: if(strpos("abba","ab")!==false) echo "Рядок ab є в abba"; або if(strpos("abba","ab")===false) echo "Рядка ab немає в abba"; Функція substr(string $str, int $from, int Slength) повертає задану ділянку рядка, тобто підрядок. Повертається підрядок рядка $str, починаючи з позиції $from довжини $length. Якщо параметр $from буде негативним, то відлік підрядка проводитиметься з кінця рядка, а не з початку. Параметр $length є необов'язковим. $str = "Book"; echo substr($str,l,l); // виведе про echo substr($str,-l,l); // виведе до Функція strcmp(Sstrl, Sstr2) порівнює два рядки і повертає наступні значення: якщо рядки рівні; якщо рядок $strl лексикографічно більше $str2;— 1, якщо рядок $strl «менше» $str2. Функція strcasecmp(string Sstrl, string Sstr2) порівнює два рядки без урахування регістра символів, тобто, рядки Book, BOOK і book для цієї функції рівні. Заміна в рядку Функція str_replace(Sstrl, Sstr2, Ssource) замінює в рядку $source (яка в процесі роботи функції не змінюється) всі входження підрядка $strl на подтроку $str2 і повертає результат у вигляді нового рядка. Припустимо, що нам потрібно замінити символи нового рядка \n на тег <br>. Це можна зробити так: $str = str_replace("\n","<br>",$str); або так: $str = nl2br($str). Функція nl2br() працює швидше, ніж str_replace, проте вона не враховує символів перекладу каретки, які часто зустрічаються в текстових файлах Windows. Функція WordWrap() виявляється дуже корисною, якщо нам потрібно відформатувати текст листа перед його облямовуванням. Дана функція розбиває текст на рядки, завершуючи кожну символом розриву (за умовчанням \n). У кожному рядку повинне бути не більше 75 символів (ви можете вказати іншу кількість). Приклад використання функції WordWrap() приведений в лістингу 9.4. Лістинг 9.4. Використання функції WordWrap() <? $s = "Дуже довгий блок тексту, який потрібне .разбить на частини перед відправкою адресатові"; echo $s."\n\n"; // розбиваємо по 15 символів $s = WordWrap($s, 15, "\n"); echo $s; ?>
Мал. 9.1. Результатработи WordWrap Примітка. Функція WordWrap не розбиває блок на рядки, як було сказано вище, а лише вставляє символ розриву через задане число символів. Функція strip_tags(). Дуже корисною є функція strip_tags(), що видаляє з рядка все HTML-теги: Ви можете вказати, які теги не варто видаляти. Якщо ви не хочете видаляти теги посилань і тег заголовка <head>, тоді вкажіть їх при виклику функції: $s = strip_tags($s,"<a><head>"); Робота з датою і часом Практично жоден серйозний проект не обходиться без роботи з датою і часом, тому не приділити увагу функції date() просто неможливо. Функція date (string $format [, int $timestamp]) використовує два параметри: Формат дати/часу (рядок). Сама дата (або час) — так званий timestamp. Функція виводить дату, що відформатувала, на основі другого параметра або на основі поточної дати, якщо параметр Stimestamp не вказаний. Рядок формату може містити звичайний текст, а також модифікатори (див. табл. 10.1), які при висновку замінюються на відповідні значення. Модифікатори формату функції Date() Таблиця 10.1 Модифікатор Опис
і Кількість секунд, що пройшли з півночі 1 січня 1970 року (з моменту підстави Unix)
Y Рік (4 цифри)
У Рік (2 цифри)
z Номер дня від початку року (від «0» до «365»)
F Повна англійська назва місяця («December»)
m Номер місяця (2 цифри: від «01» до «12»)
п Номер місяця без передуючого нуля: від «1» до «12»
М Трьохсимвольна англійська абревіатура місяця («Dec»)
d Номер дня в місяці (2 цифри: від «01» до «31»)
j Номер дня в місяці без передуючого нуля: від «1» до «31»
I Текстова назва дня тижня по-англійськи, наприклад, «Monday»
w Номер дня тижня («0» - Неділя, «1» - Понеділок і т.д.)
D Трьохбуквена англійська абревіатура дня тижня (наприклад, «Моп»)
А «До» або «пополудні: «AM» або «РМ»
а «До або «пополудні «am» або «рт»
Н Годинник (24-годинний формат) від «00» до «23»
h Годинник (12-годинний формат) від «01» до «12»
i Хвилини, від «00» до «59»
s Секунди, від «00» до «59»
Приклади використання функції date(): echo date(''Сегодня d.m.Y'1); echo date(''Дата створення файлу index.html'',filectime(''index.html' ')); При обробці введених параметрів дуже корисною виявиться функція checkdate(), яка перевіряє коректність введеної дати. Функції потрібно передати три параметри — місяць, день і рік (саме у такій послідовності). Дата перевіряється так: Рік повинен бути не менше 1900 (і не більше 32767). Місяць повинен бути в діапазоні 1...12. Число днів повинне відповідати місяцю і року (функція враховує, високосний рік чи ні). У РНР для роботи з датою і часом є додаткові функції, але розглянуті функцій цілком достатньо для роботи.