Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка PHP 2008.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆

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 данные не прямо сразу отправляются клиенту, а накапливаются в специальном буфере, чтобы потом транспортироваться большой «пачкой». Так получается быстрее. Однако, иногда бывает нужно досрочно отправить все данные из буфера пользователю, например, если что-то выводится в реальном времени.