Отправляет email-рассылки с помощью сервиса Sendsay

Программирование в Web

  Все выпуски  

Программирование в Web Выпуск 17 от 14/09/2006 Основы PHP - Урок-11


 
Программирование в web

ОСНОВЫ PHP
 

 
Внимание!!!
Все материалы уроков, публикуемых в этом и во всех последующих выпусках рассылки «Программирование в web», являются интеллектуальной собственностью авторов и ведущих рассылки. По всем вопросам размещения или публикации данных материалов на собственных ресурсах или где-либо еще, или иного использования, не связанного с личным ознакомлением и самостоятельным обучением, - обращайтесь на адрес автора. Любое использование этих материалов в коммерческих или иных целях, явно не разрешенное автором, является незаконным.
 

 
У Р О К    11
Здравствуйте уважаемые подписчики!

В этом уроке расскажу о некоторых функциях, предназначенных для работы со строками. Пока все без примеров, но, я думаю вы со мной согласитесь, - не имеет смысла разбирать примеры, не зная основных конструкций и элементов языка, к тому же, многие функции вы, возможно, никогда не будете использовать в своих сценариях, но знать о которых стоило бы. Пара примеров все же будет, и все они взяты мною, чтобы не изобретать велосипеда, у Дмитрия Котерова, за что ему большое спасибо. Если кто не знает об этом человеке, - поясню. Дмитрий Котеров - участник проекта denwer.ru, он также участвует в развитии языка программирования PHP, а также написал несколько, на мой взгляд очень удачных (если не лучших) книг, посвященных программированию на различных версиях PHP. Ну начинаю…


ФУНКЦИИ ДЛЯ РАБОТЫ СО СТРОКАМИ:

Строка - пожалуй самый универсальный и самый абстрактный объект в PHP. В ней, буквально, может содержаться все, что угодно, и число, и одиночный символ с кодом от 0 до 255 включительно, и строка символов, которая, в отличии от С не имеет никакого специального символа конца строки (то есть, строка в PHP может быть практически любой длины, ограниченной лишь размерами поддерживаемых операционной системой файлов), и запакованный массив и запакованный объект и даже код PHP, который потом можно исполнять.


А теперь перейдем собственно к самим функциям для работы со строками. В этом уроке я дам только описания функций, примеры работы с некоторыми из этих функций будем рассматривать в последующих уроках, когда будем разбирать конкретные примеры. Итак…


Конкатенация строк - о ней я уже говорил, обозначается эта операция точкой и служит для склейки двух строк между собой.


$stroka=$str1.$str2;

В результате этой операции в переменной $stroka будет содержимое двух других переменных ($str1 и $str2) соединенные без пробелов в одну строку.


str_repeat($str, $num) - Функция повторяет строку $str - $num раз.


chr($code) - возвращает отдельный символ с кодом $code - полезна для вставки какого-либо непечатаемого символа.


ord($ch) - возвращает код символа.


trim($str) - возвращает строку обрезая перед этим все начальные и конечные пробелы, символы перевода строки(\n), символы возврата картеки (\r), символы табуляции (\t).


ltrim($str) - возвращает строку с предварительно обрезанными начальными пробелами и табуляциями.


chop($str) - возвращает строку с предварительно обрезанными конечными пробелами, символами перевода строки, символами возврата каретки, символами табуляции.


Вместо ltrim() и chop() рекомендую всегда использовать trim(), хотя, возможно, когда-нибудь может возникнуть необходимость и в них.


strlen($str) - возвращает число - количество символов в строке, то есть длину строки в символах.


strpos($str, $what, $from=0) - ищет в строке $str подстроку $what и в случае успеха возвращает индекс (позицию) первого символа этой подстроки в строке. Если задан параметр $from, то поиск осуществляется с позиции (индекса) $from. По умолчанию поиск ведется от начала строки, то есть от символа с индексом (позицией) 0 (как и в массивах-списках индексация начинается с нуля).


strrpos($str, $what) - похожа на strpos(), но ищет последнее вхождение подстроки $what в строку $str. Если совпадение не найдено - возвращает false.


strcmp($str1, $str2) - сравнивает две строки посимвольно (побайтово) и возвращает 0 (ноль) если строки полностью совпадают, -1 (минус единица), если $str1 лексикографически меньше $str2 и 1 (единица) если наоборот, - $str2 меньше $str1, при этом, если одна строка длиннее другой, то она и будет считаться больше.


strcasecmp($str1, $str2) - то же, что и strcmp() но при этом не учитывается регистр символов.


substr($str, $start, [$length]) - возвращает участок строки $str начиная от позиции $start длинной $length символов, если $length не задан, то до конца строки. Данная функция применяется очень часто. Если $start и $length отрицательные, то в качестве начала отсчета принимается не начало строки, а ее конец.


str_replace($from, $to, $str) - данная функция ищет все вхождения $from в строке $str и заменяет их на $to. Эта функция хоть и не настолько универсальна, как функции для работы с регулярными выражениями ereg_replace() и preg_replace(), зато работает значительно быстрее. Если $from и $to массивы то каждый элемент массива $from при замене соответствует такому же по позиции элементу массива $to, то есть $from[0] будет заменен на $to[0].


str_ireplace($from, $to, $str) - появилась только в PHP версии 5, работает почти как str_replace() только при этом не учитывает регистр символов.


substr_replace($str, $to, $start, [$length]) - заменяет в строке $str часть строки начиная с позиции $start длинной $length символов на $to. Если $start и $length отрицательные, то в качестве начала отсчета принимается не начало строки, а ее конец.


strtr($str, $from, $to) - первый вариант этой функции с тремя параметрами применяется редко. Делает она следующее, все символы встречающиеся в $from в строке $str заменяются на такие же по позициям из $to.


strtr($str, $array) - второй вариант предыдущей функции, но с двумя параметрами, применяется очень часто. Делает эта функция следующее в строке $str ищутся все совпадения с именами ключей в $array и эти совпадения заменяются на соответствующие значения ключей. Если вы еще не поняли всей прелести этой функции, скажу, что ее очень удобно применять в различных шаблонизаторах, а также, например, для транслитерации текста. Вот пример ее применения от Дмитрия Котерова:


<?php ## Транслитерация строк.
function transliterate($st) {
   $st = strtr($st,
        "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
        "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
   );
   $st = strtr($st, array(
        'ё'=>"yo", 'х'=>"h", 'ц'=>"ts", 'ч'=>"ch", 'ш'=>"sh",
        'щ'=>"shch", 'ъ'=>'', 'ь'=>'', 'ю'=>"yu", 'я'=>"ya",
        'Ё'=>"Yo", 'Х'=>"H", 'Ц'=>"Ts", 'Ч'=>"Ch", 'Ш'=>"Sh",
        'Щ'=>"Shch", 'Ъ'=>'', 'Ь'=>'', 'Ю'=>"Yu", 'Я'=>"Ya",
   ));
   return $st;
}
echo transliterate("У попа была собака, он ее любил.");
?>

В отличии от фукнции str_replace() функция strtr() никогда не проходит по одному и тому же ключу при поиске и замене дважды. В большинстве случаев она работает даже точнее чем str_replace().


urlencode($str) - функция url-кодирует строку $str и возвращает результат.


urldecode($str) - функция обратная предыдущей, то есть производит url-декодирование строки $str.


rawurlencode($str) - аналогична urlencode($str), с той лишь разницей, что пробелы не преобразуются в +, а воспринимаются как обычные неалфавито-цифровые символы.


rawurldecode($str) - аналогична urldecode() но не воспринимает + как пробел.


htmlspecialchars($str) - Данная функция удобна тем, что позволяет защитить от вредного посетителя ваши страницы сайтов. А именно, она преобразует все теги, встречающиеся в строке $str, на их кодовые эквиваленты. То есть, если какой-то вредный посетитель пожелает испортить вам внешний вид вашей гостевой книги, написав туда сообщение и оформив его в теги, например <iframe>, а вы примените функцию htmlspacialchars($str), в браузер будет выведена абсолютно корректная строка с тегом <iframe> в виде текста, то есть браузер не воспримет этот тег как сигнальный и не начнет строить всплывающие фреймы, а просто выведет его как текст.


get_html_translation_table() - возвращает таблицу преобразования функции htmlspecialchars(). Вот как с ее помощью можно отменить действие htmlspecialchars():


<?php
$trans=array_flip(get_html_translation_table());
$str=strtr($str, $trans);
?>

В результате будет выведена строка во всем своем первозданном виде, то есть все теги будут работать именно так, как хотел бы этого написавших их.


addslashes($str) - вставляет слэши перед апострофом, двойной кавычкой и слэшами, отключая их специальную функцию.


stripslashes($str) заменяет в строке все защищенные слэшем апострофы, двойные кавычки и слэши включая их специальную функцию.


strtolower($str) - преобразует все символы в строке в нижний регистр.


strtoupper($str) - преобразует все символы в строке в верхний регистр.


ucfirst($str) - преобразует только один первый символ в строке в верхний регистр (как в предложениях).


setlocale($category, $locale) - функция преобразовывает текущую локаль вывода даты и времени, преобразования регистра символов в нужную локаль. $category может принимать следующие значения:


LC_CTYPE - активизирует указанную локаль для функций перевода в верхний/нижний регистры
LC_NUMERIC - задает разделитель целой и дробной частей дробных чисел
LC_TIME - задает формат вывода даты и времени по умолчанию
LC_ALL - устанавливает все вышеперечисленные режимы

К сожалению, имена локалей задаются при настройке операционных систем и для них стандартов почему-то не существует. Чтобы эта функция заработала правильно, надо у своего хостинг-провайдера узнать как называются его локали. Вот пример применения этой функции для Unix систем:


<?php
setlocale('LC_CTYPE', 'ru_RU.CP1251');
?>

В данном примере локаль установлена в кодировку и форматы Windows-1251. В общем пользуйтесь этой функцией с большой осторожностью, так как при переносе проекта установленная локаль может смениться и тогда на выходе в браузере будет абракадабра. Лучше вообще ее применять только когда без нее совсем не обойтись.


PHP имеет одну очень интересную функцию, для работы с русскими кодировками:


convert_cyr_string($str, $from, $to) - преобразует строку $str из кодировки $from в кодировку $to. $from и $to односимвольные строки и могут принимать следующие значения:


k - KOI8-R
w - Windows-1251
i - ISO8859-5
a - X-CP866
d - X-CP866
m - X-MAC-Cyrillic

Функция работает достаточно быстро и ее можно с успехом применять при перекодировке, например, писем в нужную кодировку перед их отправкой адресатам.


sprintf($format, [args]) - функция возвращает строку преобразованную на основе строки форматирования (спецификаторов). Каждый спецификатор формата включает максимум пять элементов, записанных слитно (в порядке их следования после служебного символа % (знак процента)):


%заполнитель [-] Размер .Точность Тип

Заполнитель - необязательный символ заполнения, который будет использован, если заданная величина занимает меньше знакомест (можно использовать либо пробел, либо 0)

Необязательный спецификатор выравнивания (по умолчанию выравнивание по правому краю, но если поставить минус (-), то выравниваться будет по левому краю

Размер - необязательный спецификатор, определяющий размер поля для вывода величины, при этом, если результат больше размера отведенного поля, то он не будет усекаться, а просто выйдет за края этого поля

Число предваренное точкой (Точность) предписывает точность, то есть количество знаков после запятой. Учитывается если производится вывод числа с плавающей точкой, в противном случае не учитывается

Обязательный параметр - Тип выводимой величины. Может принимать следующие занчения:

b - выводится как двоичное число
с - выводится символ с указанным кодом
d - целое число
f - число с плавающей точкой
o - восьмеричное целое число
s - строка символов
x - шестнадцатеричное целое число с маленькими буквами a - а
X - тоже самое, только числа A - F - записаны заглавным шрифтом

printf($format, [args]) - функция работает точно также, как и sprintf(), с той лишь разницей, что результат не возвращается в строку, а выводится напрямую в браузер.


number_format() - форматирует число с плавающей точкой с разделением его на триады с указанной точностью (в документации по PHP вы всегда сможете узнать про эту функцию и про все ее аргументы)


nl2br($str) - возвращает преобразованную строку $str в которой все символы новой строки
заменены на <br />\n


wordwrap($str, $width=75, $break="\n") - эта функция полезна при форматировании строки, перед отправкой ее адресату. Она разбивает строку на несколько строк длинной $width (по умолчанию - 75 символов) и завершает каждую из них символом перевода строки \n (здесь немного отклонюсь в прошлое, последовательность \n - это именно один символ, а именно символ перевода строки, служебная последовательность в PHP). В результате получается та же строка, только разбитая через каждые $width символов последовательностью $break (лучше всего оставить именно \n).


strip_tags($str, [$allowable_tags]) - функция удаляет из строки $str все теги, кроме перечисленных в $allowable_tags (перечисляются вплотную друг к другу) и возвращает результат. Многие для защиты от зловредных посетителей используют именно эту функцию, но я бы вам все таки рекомендовал воспользоваться лучше функцией htmlspecialchars(). Она более вежливо относится ко всем записям ото всех посетителей, но защищает при этом намного эффективнее, чем strip_tags, которая не всегда работает корректно и не всегда правильно удаляет теги.


Функцию strip_tags($str, [$allowable_tags]) хорошо применять не для защиты от зловредных посетителей, а для очистки текста от тегов.


Есть еще функции для запаковки в строку и распаковки из нее бинарных данных (pack() и unpack()) но если они вам будут интересны, в документации вы всегда сможете ознакомиться с ними поподробнее.


md5($str) - возвращает хэш-код MD5 строки $str - полезна и предпочтительна для кодирования паролей. При этом сам пароль можно и не хранить в базе, а хранить лишь его MD5-код, который для каждой строки будет практически уникальным.


crc32($str) - возвращает 32-битную контрольную сумму строки, работает быстрее md5(), но выдает намного менее надежные хэш-коды строк.


crypt($str, [$salt]) - хэш-код по алгоритму DES. Если параметр $salt не указан (обязательно двухсимвольная строка) то PHP будет генерировать случайную двухсимвольную строку и тогда хэш-коды одной и той же строки будут отличаться. Медленно, но верно устаревает.


Рекомендую везде, где необходима защита, использовать именно md5().


flush() - сброс буфера. Обычно, при выводе в браузер комадами print или echo данные не сразу отправляются на вывод, а буферизуются, команда flush() дает задание сбросить содержимое буфера в браузер сразу. С ее помощью можно реализовать, например, эффект печати текста, то есть когда он не сразу будет появляться на экране, а выводиться символ за символом.


На этом данный урок и выпуск я закончу. В следующих уроках, когда мы рассмотрим основную массу наиболее употребительных функций языка, - начнем рассматривать конкретные примеры и задачи. Оставайтесь с нами.


 

 
Объявления!!!

Если у вас возникли какие-то вопросы, не стесняйтесь, задавайте. Для этого, всего лишь, пошлите на мой адрес письмо с вопросом и с темой, в которой обязательно укажите какого урока и какого языка касается вопрос. Например, тема может быть такой - «Основы PHP. Урок 10. Вопрос». Также, с такой же темой и на этот же адрес вы можете прислать и свои дополнения к уроку. Если дополнения будут существенными, то в последующих уроках они обязательно будут учтены.

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

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

Маленькая просьба. Многие из вас присылают мне запросы на отправку им того или иного, не полученного ранее, выпуска рассылки. У меня не всегда есть возможность это сделать. Поэтому предлагаю вам для начала посмотреть нужный выпуск в архиве рассылки. Рассылка выходит сразу на трех рассыльных сервисах, и по некоторым причинам (мне не известным) некоторые сервисы не принимают адресов, в которых встречаются именя конкурирующих рассыльных сервисов, по этой причине я опубликую только одну ссылку на архив рассылки только одного рассыльного сервиса, а именно Content.mail.ru. Вот ссылка на на этот архив рассылки - http://content.mail.ru/pages/p_21931.html. В обще м-то это объявление наверное лишнее, ведь в каждом выпуске каждой рассылки, вне зависимости от того, на каком сервисе она выходит, всегда указан этот самый адрес архива рассылки. На сабскрайб.ру и на контент.мэйл.ру этот адрес указывается в самом низу выпуска, а на мэйллист.ру - в самом верху выпуска. Так что, при достаточном внимании, вы сами легко сможете найти нужную ссылку на архив рассылки.

 

 
Внимание!!!
Все материалы уроков, публикуемых в этом и во всех последующих выпусках рассылки «Программирование в web», являются интеллектуальной собственностью авторов и ведущих рассылки. По всем вопросам размещения или публикации данных материалов на собственных ресурсах или где-либо еще, или иного использования, не связанного с личным ознакомлением и самостоятельным обучением, - обращайтесь на адрес автора. Любое использование этих материалов в коммерческих или иных целях, явно не разрешенное автором, является незаконным.
 

 
Наш проект и наши друзья
Автор рассылки — Anatolick
Архив рассылки — http://content.mail.ru/pages/p_21931.html
Сайт проекта — «Russian discussions Zone»
Движок для сайтов — «Tanat-Engine»
Проект Web Help — «Web-Help.int.ru»
Дискуссионный лист — «Все для Всех о РС»
Дискуссионный лист — «File Info Masters»
Дискуссионный лист — «Напряги мозги»
Дискуссионный лист — «Ищем все…»
Дискуссионный лист — «Все обо Всем по Email»
Дискуссионный лист — «Внимание! Розыск…»
Дискуссионный лист — «Английский для Всех и каждого»
Группа стандартизации в Web — W3C.org
 

В избранное