- •Тема 1 Основы cgi-программирования
- •1.1 Методы передачи данных
- •1.2 Передача документа пользователю
- •1.3 Передача информации cgi-сценарию
- •Тема 2 Характеристика языка php
- •2.1 Принцип работы php
- •2.2 Переменные, константы, выражения
- •Тема 3 Работа с данными формы
- •3.1 Передача данных
- •3.2 Трансляция полей формы в переменные
- •Тема 4 Конструкции языка
- •4.1 Условные инструкции
- •4.2 Инструкции циклов
- •4.3 Инструкции включения
- •Тема 5 Ассоциативные массивы
- •5.1 Списки и ассоциативные массивы
- •5.2 Операции над массивами
- •5.3 Списки и строки
- •5.4 Сериализация
- •Тема 6 Работа с массивами
- •6.1 Сортировка массивов
- •6.2 Функции для работы с массивами
- •Тема 7 Функции и области видимости
- •7.1 Формат определения функции, передача параметров
- •7.2 Глобальные, локальные, статические переменные
- •7.3 Рекурсия, вложенные и условно-определяемые функции
- •7.4 Передача функций по ссылке и возврат функцией ссылки
- •Тема 8 Строковые функции
- •8.1 Функции работы со строками
- •8.2 Работа с блоками текста
- •Тема 9 Математические функции
- •9.1 Встроенные константы
- •9.2 Встроенные функции
- •Тема 10 Работа с файлами и каталогами,
- •10.1 Функции работы с файлами
- •10.2 Блокирование файла
- •10.3 Функции работы с каталогами
- •10.4 Запуск внешних программ
- •Тема 11 Работа с датами и временем,
- •11.1 Представление времени в формате timestamp
- •11.2 Работа с датами, григорианский календарь
- •11.3 Посылка писем через php
- •Тема 12 Работа с www
- •12.1 Установка заголовков ответа
- •12.2 Работа с Cookies
- •Тема 13 Управление интерпретатором
- •13.1 Управление интерпретатором
- •13.2 Управление сессиями
- •Тема 14 Работа с базой данных mysql
- •14.1 Соединение с базой данных
- •14.2 Выполнение запросов к базе данных
- •Тема 15 Загрузка файлов на сервер
- •15.1 Multipart-формы, тег выбора файла
- •15.2 Поддержка закачки в php
- •Учебное издание
- •Разработка программного обеспечения на платформе net: php.Net
- •246019 Г. Гомель, ул. Советская, 104
8.2 Работа с блоками текста
string str_replace(string $from, string $to, string $str)
Заменяет в строке $str все вхождения подстроки $from (с учетом регистра) на $to и возвращает результат. Исходная строка, переданная третьим параметром, при этом не меняется. Пример замены всех символов перевода строки на их HTML- эквивалент – тэг <br>:
$st=str_replace("\n","<br>\n",$st)
То, что в строке <br>\n тоже есть символ перевода строки, никак не влияет на работу функции, т. е. функция производит лишь однократный проход по строке.
string nl2br(string $string)
Заменяет в строке все символы новой строки \n на <br>\n и возвращает результат. Исходная строка не изменяется. Символы \r, которые присутствуют в конце строки текстовых файлов Windows, этой функцией никак не учитываются, а потому остаются на старом месте.
string WordWrap(string $st, int $width=75, string $break="\n")
Функция разбивает блок текста $st на несколько строк, завершаемых символами $break, так, чтобы на одной строке было не более $width букв. Разбиение происходит по границе слова, так что текст остается читаемым. Возвращается получившаяся строка с символами перевода строки, заданными в $break. Пример форматирования текста по ширине поля 60 символов, предварив каждую строку префиксом ">":
function Cite($OurText, $prefix="> ")
{ $st=WordWrap($OurText, 60-strlen($prefix), "\n");
$st=$prefix.str_replace("\n","\n$prefix",$st);
return $st;
}
string strip_tags (string $str [, string $allowable_tags])
Функция удаляет из строки все тэги и возвращает результат. В параметре $allowable_tags можно передать тэги, которые не следует удалять из строки. Они должны перечисляться вплотную друг к другу. Пример:
$st="
<b>Жирный текст</b>
<tt>Моноширинный текст</tt>
<a href=http://www.dklab.ru>Ссылка</a>";
echo "Исходный текст: $st";
echo "<hr>После удаления тэгов: ".strip_tags($st,"<a><b>")."<hr>";
Тэги <a> и <b> не были удалены (ровно как и их парные закрывающие), в то время как <tt> исчез.
string str_repeat(string $st, string $number)
Функция «повторяет» строку $st $number раз и возвращает объединенный результат. Пример:
echo str_repeat("test!",3); // выводит test!test!test!
Функции для преобразований символов:
string strtr(string $str, string $from, string $to)
Функция в строке $str заменяет все символы, встречающиеся в $from, на их «парные» (то есть расположенные в тех же позициях, что и во $from) из $to.
string UrlEncode(string $st)
Функция URL-кодирует строку $st и возвращает результат. Эту функцию удобно применять, если нужно динамически сформировать ссылку <a href=...> на какой-то сценарий, но не уверены, что его параметры содержат только алфавитно-цифровые символы. Пример:
echo "<a
href=/script.php?param=".UrlEncode($UserData);
Если переменная $UserData включает символы =, & или даже пробелы, все равно сценарию будут переданы корректные данные.
string UrlDecode(string $st)
Производит URL-декодирование строки. Используется редко, т.к. PHP и так умеет перекодировать входные данные автоматически.
string RawUrlEncode(string $st)
Почти полностью аналогична UrlEncode(), но только пробелы не преобразуются в +, как это делается при передаче данных из формы, а воспринимаются как обычные неалфавитно-цифровые символы.
string RawUrlDecode(string $st)
Аналогична UrlDecode(), но не воспринимает + как пробел.
string HtmlSpecialChars(string $str)
Заменяет в строке символы: &, <, >, кавычки на их HTML-эквиваленты, так, чтобы они выглядели на странице «самими собой». Пример применения этой функции – формирование параметра value в элементах формы, чтобы не было проблем с кавычками, или вывод сообщения в гостевой книге, если вставлять тэги пользователю запрещено. Пусть содержимое книги хранится в массиве $Book. Пример печати содержимого гостевой книги, чтобы тэги не воспринимались браузером как описания форматирования:
<?foreach($Book as $k=>$v) {?>
Имя: <?=$v['name']?><br>
Текст: <?=HtmlSpecialChars($v['text'])?> <hr>
<?}?>
string StripSlashes(string $st)
Заменяет в строке $st некоторые предваренные слэшем символы на их однокодовые эквиваленты. Это относится к символам: ", ', \.
string AddSlashes(string $st)
Вставляет слэши только перед символами: ', " и \.
Функции изменения регистра:
string strtolower(string $str)
Преобразует строку в нижний регистр.
string strtoupper(string $str)
Переводит строку в верхний регистр.
Функции форматных преобразований. Переменные в строках PHP интерполируются, поэтому практически всегда задача «смешивания» текста со значениями переменных не является проблемой:
echo "Привет, $name! Вам $age лет.";
Язык PHP поддерживает ряд функций, использующих такой же синтаксис, как и их Си-эквиваленты.
string sprintf(string $format [, mixed args, ...])
Функция возвращает строку, составленную на основе строки форматирования, содержащей некоторые специальные символы, которые будут впоследствии заменены на значения соответствующих переменных из списка аргументов. Строка форматирования $format может включать в себя команды форматирования, предваренные символом %. Все остальные символы копируются в выходную строку как есть. Каждый спецификатор формата (то есть, символ % и следующие за ним ко-
манды) соответствует одному параметру, указанному после параметра $format. Если нужно поместить в текст % как обычный символ, необходимо его удвоить:
echo sprintf("Значение %d%%",$d);
Каждый спецификатор формата включает максимум пять элементов (в порядке их следования после символа %):
Необязательный спецификатор размера поля, который указывает, сколько символов будет отведено под выводимую величину. В качестве символов-заполнителей (если значение имеет меньший размер, чем размер поля для его вывода) может использоваться пробел или 0, по умолчанию подставляется пробел. Можно задать любой другой символ-наполнитель, если указать его в строке форматирования, предварив апострофом '.
Опциональный спецификатор выравнивания, определяющий, будет результат выровнен по правому или по левому краю поля. По умолчанию производится выравнивание по правому краю, однако можно указать и левое выравнивание, задав символ (минус).
Необязательное число, определяющее размер поля для вывода величины. Если результат не будет в поле помещаться, то он «вылезет» за края этого поля, но не будет усечен.
Необязательное число, предваренное точкой ".", предписывающее, сколько знаков после запятой будет в результирующей строке. Этот спецификатор учитывается только в том случае, если происходит вывод числа с плавающей точкой, в противном случае он игнорируется.
Обязательный спецификатор типа величины, которая будет помещена в выходную строку: b – очередной аргумент из списка выводится как двоичное целое число; c – выводится символ с указанным в аргументе кодом; d – целое число; f – число с плавающей точкой; o – восьмеричное целое число; s – строка символов; x – шестнадцатеричное целое число с маленькими буквами a–z; X – шестнадцатеричное число с большими буквами A–Z.
Примеры:
$money1 = 68.75;
$money2 = 54.35;
$money = $money1 + $money2;
// echo $money выведет "123.1"...
$formatted = sprintf ("%01.2f", $money);
// echo $formatted выведет "123.10"!
// вывода целого числа, предваренного нужным количеством нулей:
$isodate=sprintf("%04d-%02d-%02d", $year, $month, $day);
void printf(string $format [, mixed args, ...])
Делает то же, что и sprintf(), только результирующая строка не возвращается, а направляется в браузер пользователя.
string number_format(float $number,
int $decimals, string $dec_point=".",
string $thousands_sep=",");
Функция форматирует число с плавающей точкой с разделением его на триады с указанной точностью. Она может быть вызвана с двумя или четырьмя аргументами, но не с тремя! Параметр $decimals задает, сколько цифр после запятой должно быть у числа в выходной строке. Параметр $dec_point представляет собой разделитель целой и дробной частей, а параметр $thousands_sep – разделитель триад в числе (если указать на его месте пустую строку, то триады не отделяются друг от друга).
В PHP существует еще несколько функций для выполнения форматных преобразований, среди них – sscanf() и fscanf(), которые часто применяются в Си.
Работа с бинарными данными. Строки могут содержать любые, в том числе и бинарные, данные (то есть, символы с кодами, меньшими 32). Для работы с такими строками иногда удобно использовать функции pack() и unpack().
string pack(string $format [,mixed $args, ...])
Функция pack() упаковывает заданные аргументы в бинарную строку. Формат параметров, а также их количество, задается при помощи строки $format, которая представляет собой набор однобуквенных спецификаторов форматирования – наподобие тех, которые указываются в sprintf(), но только без знака %. После каждого спецификатора может стоять число, которое отмечает, сколько информации будет обработано данным спецификатором. А именно, для форматов a, A, h и H число задает, какое количество символов будет помещено в бинарную строку из тех, что находятся в очередном параметре-строке при вызове функции (то есть, определяется размер поля для вывода строки). В случае @ оно определяет абсолютную позицию, в которую будут помещены следующие данные. Для всех остальных спецификаторов следующие за ними числа задают количество аргументов, на которые распространяется действие данного формата. Вместо числа можно указать *, в этом случае подразумевается, что спецификатор действует на все оставшиеся данные. Список спецификаторов формата: a – строка, свободные места в поле заполняются символом с кодом 0; A – строка, свободные места заполняются пробелами; h – шестнадцатеричная строка, младшие разряды в начале; H – шестнадцатеричная строка, старшие разряды в начале; c – знаковый байт (символ); C – беззнаковый байт; s – знаковое короткое целое (16 бит); S – беззнаковое короткое целое; n – беззнаковое целое (16 битов, старшие разряды в конце); v – беззнаковое целое (16 битов, младшие разряды в конце); i – знаковое целое; I – беззнаковое целое; l – знаковое длинное целое; L – беззнаковое длинное целое; N – беззнаковое длинное целое; V – беззнаковое целое (32 бита, младшие разряды в конце); f – число с плавающей точкой; d – число с плавающей точкой двойной точности; x – символ с нулевым кодом; X – возврат назад на 1 байт; @ –заполнение нулевым кодом до заданной абсолютной позиции.
Пример:
// Целое, целое, все остальное – символы
$bindata = pack("nvc*", 0x1234, 0x5678, 65, 66);
В строке $bindata будет содержаться 6 байтов в такой последовательности: 0x12, 0x34, 0x78, 0x56, 0x41, 0x42 (в шестнадцатеричной системе счисления).
array unpack(string $format, string $data)
Функция распаковывает строку $data, пользуясь информацией о формате $format. Возвращает она ассоциативный массив, содержащий элементы распакованных данных. В строке $format после каждого спецификатора (или после завершающего его числа) должно «впритык» следовать имя ключа в ассоциативном массиве. Разделяются параметры при помощи символа /. Пример:
$array=unpack("c2chars/nint", $bindata);
В результирующий массив будут записаны элементы с ключами: chars1, chars2 и int. Если после спецификатора задано число, то к имени ключа будут добавлены номера 1, 2 и т. д., т. е. в массиве появятся несколько ключей, отличающихся суффиксами.
Хэш-функции
string md5(string $st)
Возвращает хэш-код строки $st, основанный на алгоритме корпорации RSA Data Security под названием «MD5 Message-Digest Algorithm». Хэш-код – это строка, практически уникальная для каждой из строк $st. То есть вероятность того, что две разные строки, переданные в $st, дадут нам одинаковый хэш-код, стремится к нулю. Если длина строки $st может достигать нескольких тысяч символов, то ее MD5-код занимает максимум 32 символа.
Хэш-код и алгоритм MD5 используется для проверки паролей на истинность. Пусть, например, есть система со многими пользователями, каждый из которых имеет свой пароль. Можно хранить все пароли в обычном виде, или зашифровать их каким-нибудь способом, но тогда велика вероятность того, что этот файл с паролями украдут. Если пароли были зашифрованы, то, зная метод шифрования, не составит особого труда их раскодировать. Однако можно поступить другим способом, при использовании которого даже если файл с паролями украдут, расшифровать его будет математически невозможно. Сделаем так: в файле паролей будем хранить не сами пароли, а их (MD5) хэш-коды. При попытке какого-либо пользователя войти в систему мы вычислим хэш-код только что введенного им пароля и сравним его с тем, который записан у нас в базе данных. Если коды совпадут, значит, все в порядке, а если нет – что ж, извините... При вычислении хэш-кода какая-то часть информации о строке $st безвозвратно теряется. И именно это позволяет не опасаться, что файл паролей можно расшифровать. Ведь в нем нет самих паролей, нет даже их каких-то связных частей!
Алгоритм MD5 специально был изобретен для того, чтобы обеспечить описанную выше схему. Так как все же есть вероятность того, что у разных строк MD5-коды совпадут, то, чтобы не дать возможность войти в систему, перебирая пароли с бешеной скоростью, алгоритм MD5 работает довольно медленно. И его нельзя никак убыстрить, потому что это будет уже не MD5. Так что даже на самых мощных компьютерах вряд ли получится перебирать более нескольких тысяч паролей в секунду, а это совсем маленькая скорость.
int crc32(string $str)
Функция вычисляет 32-битную контрольную сумму строки $str. То есть, результат ее работы – 32-битное (4-байтовое) целое число. Эта функция работает гораздо быстрее md5(), но в то же время выдает гораздо менее надежные «хэш-коды» для строки. Алгоритм crc32 имеет неизмеримо большую предсказуемость, чем MD5.
string crypt(string $str [,string $salt])
Алгоритм шифрования DES до недавнего времени был стандартным для всех версий Unix и использовался для кодирования паролей пользователей (тем же самым способом, о котором мы говорили при рассмотрении функции md5()). Но в последнее время MD5 постепенно начал его вытеснять. Хэш-код для одной и той же строки, но с различными значениями $salt (это должна быть обязательно двухсимвольная строка) дает разные результаты. Если параметр $salt пропущен, PHP сгенерирует его случайным образом:
$st="This is the test";
echo crypt($st)."<br>";
// можем получить, например, 7N8JKLKbBWEhg
echo crypt($st)."<br>";
// а здесь появится, например, Jsk746pawBOA2
Два одинаковых вызова crypt() без второго параметра выдают совершенно разные хэш-коды.
Сброс буфера вывода
void flush()
Функция отправляет содержимое буфера echo в браузер пользователя. Обычно при использовании echo данные не прямо сразу отправляются клиенту, а накапливаются в специальном буфере, чтобы потом транспортироваться большой «пачкой». Так получается быстрее. Однако, иногда бывает нужно досрочно отправить все данные из буфера пользователю, например, если что-то выводится в реальном времени.
