Для начинающих пользователей ПК

Php подстановка. Str_replace - Заменяет все вхождения строки поиска на строку замены. Функции вывода на внешнее устройство и в строку

Безусловно, изображения, звуковые файлы, видеоинформация, анимационные данные и аплеты составляют важную часть информационного наполнения World Wide Web, но подавляющая часть данных в веб все еще представлена в виде текста - последовательностей символов, подобных данному предложению. Основным типом данных PHP, предназначенным для представления текста, является строка.

Описание строк в PHP

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

$myString = "Простая строка"; $anotherString = "Еще одна строка";

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

Например, после обработки следующего кода, входящего в состав веб-страницы:

$count = 13; $string1 = "В строке \"Hello, world!\" $count символов.
"; $string2 = "В строке \"Hello, world!\" $count символов.
"; echo $string1; echo $string2;

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

Подстановка значений с использованием фигурных скобок

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

Первая ситуация состоит в том, что интерпретатор не может определить, где оканчивается имя переменной, а вторая ситуация возникает, когда необходимо подставить в строку не значение простой переменной, а значение выражения. В этих случаях разработчик может внести ясность, заключив имя или выражение, подлежащее обработке, в фигурные скобки ({}).

Например, интерпретатор PHP не испытывает затруднений при обработке следующего кода:

$sport = "волейбол"; $play = "Я люблю играть в $sport.";

В таких случаях интерпретатор обнаруживает символ $, после чего начинает собирать символы в подстроку для выявления имени переменной и выполняет такую сборку до тех пор, пока не встретится пробел или точку, которые следуют за именем переменной $sport. Пробелы и точки не могут входить в состав имени переменной, поэтому становится ясно, что рассматриваемая переменная имеет имя $sport; после этого интерпретатор PHP успешно находит значение для данной переменной ("волейбол") и подставляет его.

Но иногда не существует возможности обозначить конец имени переменной с помощью пробела или точки. Рассмотрим следующий пример:

$sport1 = "волей"; $sport2 = "фут"; $sport3 = "баскет"; // Неправильные конструкции $play1 = "Я люблю играть в $sport1бол."; $play2 = "Я люблю играть в $sport2бол."; $play3 = "Я люблю играть в $sport3бол.";

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

// Правильная конструкция $play1 = "Я люблю играть в {$sport1}бол."; $play2 = "Я люблю играть в {$sport2}бол."; $play3 = "Я люблю играть в {$sport3}бол.";

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

По аналогичным причинам интерпретатор PHP, если не используются фигурные скобки, сталкивается с затруднениями при подстановке значений сложных выражений с именами переменных, наподобие обращений к элементам многомерных массивов и к объектным переменным. Общее правило состоит в том, что если за открывающей фигурной скобкой ({) непосредственно следует символ $, то интерпретатор PHP вычисляет значение выражения с именем переменной вплоть до закрывающей фигурной скобки (}), а затем подставляет результирующее значение в строку. (Если требуется, чтобы в строке появилось литеральное значение {$, это можно обеспечить, поставив перед каждым из этих символов обратную косую черту, \).

Символы и индексы символов в строках

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

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

$myString = "Doubled"; for ($index = 0; $index < strlen($myString); $index++) { $char = $myString{$index}; print("$char$char"); }

приводит к получению в окне браузера такого вывода:

Очевидно, что при каждом проходе по циклу каждый символ строки выводится дважды. Функция strlen() возвращает длину строки.

Операции со строками

В языке PHP предусмотрены две строковые операции: операция со знаком операции точка (.), или операция конкатенации, и операция со знаком операции точка и знак равенства (.=), или операция конкатенации и присваивания. Рассмотрим следующий пример:

$string1 = "Это часть"; $string2 = "строки"; // Конкатенация строк echo $string1." простой ".$string2."
"; // "Это часть простой строки" // Конкатенация и присваивание $string1 .= " простой "; // Эквивалентно $string1 = $string1." простой "; $string1 .= $string2; echo $string1; // "Это часть простой строки"

Следует отметить, что в приведенном выше примере первому оператору echo не передается несколько строковых фактических параметров; передается только один строковый фактический параметр, созданный в результате конкатенации четырех строк. Первая и третья строки заданы с помощью переменных, а вторая и четвертая строки представляют собой литеральную строку, заключенную в двойные кавычки.

Синтаксическая структура вложенного документа (Heredoc)

Кроме синтаксических структур строк в одинарных и двойных кавычках, в языке PHP предусмотрен еще один способ задания строки, называемый синтаксической структурой вложенного документа (Heredoc) . Как оказалось, подобная синтаксическая структура является весьма удобным средством задания больших фрагментов текста, подставляемого с помощью переменных, поскольку избавляет пользователя от необходимости обозначать внутренние кавычки с помощью специальных символов. Такой способ особенно удобен при создании страниц, которые содержат формы HTML.

Знаком операции, применяемом в синтаксической структуре вложенного документа, является (<<<). За этим знаком должна непосредственно следовать метка (не заключенная в кавычки), которая обозначает начало многострочного текста. Интерпретатор PHP продолжает включать в состав значения переменной следующие строки до тех пор, пока снова не появится эта же метка в начале строки. За заключительной меткой может следовать необязательная точка с запятой, а какие-либо другие символы после метки не допускаются.

Рассмотрим следующий пример:

$string = <<

EOT; echo $string;

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

Подстановка значений переменных осуществляется с использованием точно такого же способа, как и при использовании строк, заключенных в двойные кавычки. Удобной особенностью вложенного документа является то, что в обозначаемый таким образом текст можно вводить знаки кавычек без применения каких-либо управляющих символов, и это не приводит к преждевременному завершению формирования строки. Пример, показанный выше, выводит простейшую HTML-форму:

Строковые функции

В языке PHP предусмотрено большое количество разнообразных функций для обработки и преобразования строк. Если у вас когда-либо возникнет необходимость создать собственную функцию, которая читает и обрабатывает строки символ за символом, чтобы сформировать новую строку, вначале подумайте, не могла ли аналогичная задача возникнуть перед кем-либо раньше. А если интуиция подсказывает, что такая вероятность существует, то, возможно, имеется и встроенная функция, которая решает поставленную задачу. Для получения дополнительной информации о строковых функциях обратитесь по адресу https://php.net/manual/ru/ref.strings.php .

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

Проверка строк

На какие вопросы, касающиеся строк, чаще всего приходится искать ответ? Первым в списке вопросов является вопрос о том, какую длину имеет строка; для ответа на него используется функция strlen(), имя которой является сокращением от string length - длина строки. Пример применения такой функции приведен ниже:

$enStr = "Hello world!"; $rusStr = "Простая строка"; echo $enStr." - ".strlen($enStr)." символов
"; echo $rusStr." - ".strlen($rusStr)." символов";

Выполнение этого кода приводит к получению следующего неоднозначного вывода:

Как видите, для строки "Hello world!" результат получился правильным, но для строки "Простая строка" результат в 27 символов является неверным. В чем же тут дело? Дело в том, что функция strlen() считает именно байты, а не символы. В первом случае все символы в строке являются англоязычными, т.е. представлены кодировкой ASCII и кодируются 1 байтом. Во втором случае в строке есть русские символы, которые кодируются 2 байтами (UTF-8). Чтобы избежать проблем в дальнейшем при работе со строковыми функциями, в PHP следует использовать функции для многобайтных кодировок, начинающихся с префикса mb_. Это значит, что в предыдущем примере надо заменить функцию strlen() на mb_strlen() и явно указать кодировку:

Echo $rus_str." - ".mb_strlen($rus_str, "UTF8")." символов";

Поиск символов и подстрок

Следующий вопрос, касающийся строк, заключается в том, что они содержат. Например, функция strpos() позволяет найти номер позиции конкретного символа в строке, если таковой имеется:

$enStr = "Hello world!"; echo "Символ "l": ".strpos($enStr, "l"); // 2

Ситуации, связанные с применением функции strpos(), относятся к тем случаям, в которых невосприимчивость языка PHP к типам может стать источником проблем. Если соответствие не найдено, то функция возвращает ложное значение, а если искомый символ совпадает с самым первым символом в строке, то функция возвращает 0 (поскольку отсчет позиций символов в строке начинается с 0, а не с 1). Оба эти значения соответствуют ложному значению при использовании для проверки логического условия. Один из способов, позволяющих различить эти значения, состоит в применении операции сравнения на идентичность (операции ===, введенной начиная с версии PHP4), которая возвращает истинное значение, только если ее операнды являются одинаковыми и относятся к одному и тому же типу. Операцию сравнения на идентичность можно использовать для проверки того, равно ли возвращаемое значение 0 (или имеет значение false), без риска спутать возвращаемое значение с другими значениями, которые могут стать одинаковыми с ним после приведения типа.

Функция strpos() может также использоваться для поиска подстроки, а не одного символа. Для этого достаточно задать в качестве искомой многосимвольную, а не односимвольную строку. Кроме того, в вызове этой функции можно задать дополнительный целочисленный параметр, который указывает позицию начала поиска.

Возможен также поиск в обратном направлении, от конца строки к началу. Для этого используется функция strrpos() . (Обратите внимание на то, что в имени этой функции есть дополнительная буква r, которая является сокращением от слова reverse - обратный.) Эта функция принимает в качестве параметров строку, в которой должен выполняться поиск, и искомую односимвольную строку, после чего возвращает последнюю позицию вхождения второго параметра в первый параметр. (В отличие от функции strpos() в функции strrpos() искомая строка должна состоять только из одного символа.) После применения этой функции с теми же параметрами, что и в предыдущем примере, будет найдена другая позиция:

$enStr = "Hello world!"; echo "Символ "l": ".strrpos($enStr, "l"); // 9 т.к. поиск ведется с конца строки

Сравнение

Совпадает ли та строка с этой строкой? По-видимому, в коде часто приходится искать ответ также и на этот вопрос, особенно когда приходится обрабатывать входные данные, введенные конечным пользователем.

Простейший метод поиска ответа на вопрос о том, являются ли строки одинаковыми, состоит в использовании простой операции сравнения на равенство (==), которая обеспечивает проверку на равенство не только строк, но и чисел. При использовании операции == две строки рассматриваются как одинаковые, если содержат полностью одинаковые последовательности символов. При этом не выполняется проверка на соблюдение более строгого определения одинаковых строк, например, того условия, что эти строки хранятся по одному и тому же адресу в памяти, но учитывается регистр букв (иными словами, учитывается то, являются ли сравниваемые буквы прописными или строчными).

Результатам сравнения двух строк с использованием операции == (или соответствующих операций < и >) можно доверять, только если оба операнда являются строками и известно, что не производилось какое-либо преобразование типов. А результатам проверки с помощью функции strcmp(), которая описана ниже, можно доверять всегда.

Наиболее важной функцией сравнения строк, с помощью которой выполняется основной объем работы, является strcmp(). Эта функция принимает две строки в качестве параметров и сравнивает байт за байтом, пока не обнаружит различие. После этого функция возвращает отрицательное число, если первая строка меньше второй, и положительное число, если вторая строка меньше первой. Если строки идентичны, функция strcmp() возвращает ноль.

Функция strcasecmp() действует по такому же принципу, за исключением того, что при сравнении на равенство не учитывается регистр букв. Например, вызов функции strcasecmp("hey!", "HEY!") должен возвратить нуль.

Поиск

Только что описанные функции сравнения позволяют узнать, равна ли одна строка другой строке. А для определения того, содержится ли одна строка в другой, используется функция strpos(), описанная выше, или функция strstr() и подобные ей функции.

Функция strstr() принимает в качестве параметров строку, в которой должен быть выполнен поиск, и искомую строку (в указанном порядке). В случае успеха данная функция возвращает часть строки, которая начинается с первого вхождения искомой строки (и включает искомую строку). Если такая строка не найдена, функция возвращает ложное значение. В следующем фрагменте кода приведены примеры применения этой функции:

$str = "Привет мир!"; $findStr = "мир"; echo "Подстрока "$findStr" в исходной строке: ".strstr($str, $findStr);

Так же как и функция strcmp(), функция strstr() имеет версию, нечувствительную к регистру, которая имеет имя stristr() (буква i в этом имени является сокращением от слова insensitive - нечувствительный). Функция stristr() идентична функции strstr() во всех отношениях, за исключением того, что при сравнении строчные буквы рассматриваются как прописные аналоги.

Выборка подстроки

Многие строковые функции PHP выполняют над строками операции вырезки и вставки. Под вырезкой подразумевается выборка части строки, а под вставкой - избирательная модификация строки. Следует учитывать, что даже функции вставки (чаще всего) не модифицируют строку, заданную в качестве входного параметра. Обычно такие функции возвращают модифицированную копию и оставляют исходный параметр неизменным.

Наиболее простой способ выборки части строки состоит в применении функции substr() , которая возвращает новую строку, содержащую часть подпоследовательности символов из старой строки. В качестве параметров функция substr() принимает строку (из которой осуществляется выборка подстроки), целое число (позиция, с которой начинается требуемая подстрока) и необязательный целочисленный третий параметр, который задает длину требуемой подстроки. Если третий параметр не задан, то подразумевается, что подстрока продолжается до конца строки. (Следует помнить, что и при использовании этой функции нумерация позиций в строке начинается с нуля, а не с единицы, как и во всех параметрах функций PHP, которые обозначают числовые позиции в строках.) Например:

$str = "Привет мир!"; echo mb_substr($str, 7, 3, "UTF8"); // "мир"

И параметр с обозначением начальной позиции, и параметр с обозначением длины могут быть отрицательными, но в обоих этих случаях отрицательное значение имеет разный смысл. Если отрицательной является начальная позиция, то позиция начального символа подстроки определяется путем обратного отсчета от конца строки, а не прямого отсчета от начала строки. (Начальная позиция, равная -1, указывает, что отсчет начинается с последнего символа, значение -2 указывает на предпоследний символ и т.д.)

На основании этого можно было бы предположить, что отрицательное значение длины также подразумевает, что подстрока должна определяться путем обратного отсчета от начального символа, а не прямого отсчета, но дело обстоит иначе. Утверждение, согласно которому символ в начальной позиции является первым символом в возвращаемой строке (а не последним), всегда остается справедливым. Вместо этого параметр с отрицательным значением длины означает, что конечный символ определяется путем обратного отсчета от конца, а не прямого отсчета от начальной позиции.

Ниже приведены некоторые примеры с положительными и отрицательными параметрами:

$str = "Привет мир!"; echo mb_substr($str, 7, 3, "UTF8")."
"; // "мир" echo mb_substr($str, -4, 3, "UTF8")."
"; // "мир" echo mb_substr($str, 0, -5, "UTF8")."
"; // "Привет"

Удаление пробелов и символов табуляции из строк

С формальной точки зрения функции chop(), ltrim() и trim() представляют собой функции для работы с подстроками (которые во многом напоминают другие функции), но фактически указанные функции предназначены для удаления ненужных символов из строк. Функции chop(), ltrim() и trim(), соответственно, удаляют пробельные символы, находящиеся в конце, в начале, в начале и в конце, из строки, указанной в качестве единственного строкового параметра.

Кроме пробелов, эти функции удаляют другие пробельные символы, подобные тем, которые обозначаются с помощью управляющих последовательностей, \n, \r, \t и \0 (символов обозначения конца строки, знаков табуляции и нуль-символов, используемых для обозначения конца строки в программах на языке C).

В языке PHP обычно принято применять функцию удаления пробельных символов в конце строки с именем chop(), но может быть также вызвана идентичная функция, имеющая более выразительное имя rtrim(). Наконец, следует отметить, что функция chop(), несмотря на то, что ее имя, которое означает "отрубить", звучит очень грозно, не повреждает исходный параметр $original, который сохраняет предыдущее значение.

Замена строк

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

Функция str_replace() позволяет заменить все вхождения заданной конкретной подстроки другой строкой. Эта функция принимает три параметра: строка, в которой должен быть выполнен поиск, подстрока, подлежащая замене после ее обнаружения, и строка, которая должна применяться для замены. Рассмотрим следующий пример:

$str = "Привет мир!"; echo str_replace("мир", "планета", $str); // "Привет планета!"

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

Как было показано выше, функция str_replace() выбирает часть исходной строки, подлежащую замене, отыскивая вхождения искомой подстроки в исходной строке; в отличие от этого функция substr_replace() выбирает часть, подлежащую замене, по ее абсолютной позиции. Эта функция принимает до четырех параметров: строка, в которой должна быть выполнена замена, строка, применяемая в качестве замены, начальная позиция замены и (в качестве необязательного параметра) длина заменяемой части строки. Рассмотрим следующий пример:

Echo substr_replace("ABCDEFG", "-", 2, 3); // "AB-FG"

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

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

Наконец, имеется ряд менее широко применяемых функций, которые формируют новые строки из старых. Функция strrev() просто возвращает новую строку, в которой символы входной строки расставлены в обратном порядке. Функция str_repeat() принимает один строковый и один целочисленный параметр и возвращает строку, в которой собрано указанное количество копий строкового параметра:

Echo str_repeat("ABC", 3); // ABCABCABC

Функции преобразования регистра букв

Эти функции позволяют преобразовывать строчные буквы в прописные и наоборот. Функция strtolower() возвращает строку, в которой все буквы преобразованы в строчные. При этом не имеет значения, содержала ли исходная строка исключительно прописные буквы или прописные и строчные. Например:

$str = "Привет мир!"; echo mb_strtolower($str, "UTF8"); // "привет мир!"

Если вы уже сталкивались с необходимостью выполнять большой объем проверки форм, то могли заметить, что функция strtolower() является исключительно удобным средством обработки адресов электронной почты, полученных от тех пользователей, которые все еще не знают, что регистр букв в этих адресах не учитывается. Не менее полезными являются и другие функции, относящиеся к рассматриваемой категории.

Функция strtoupper() возвращает строку, в которой все буквы преобразованы в прописные. В качестве примера можно привести следующий фрагмент кода:

$str = "Привет мир!"; echo mb_strtoupper($str, "UTF8"); // "ПРИВЕТ МИР!"

Функция ucfirst() преобразует в прописную только первую букву строки, функция ucwords() преобразует в прописную первую букву каждого слова в строке. Ни функция ucwords(), ни ucfirst() не имеют аналогичной функции для многобайтной кодировки, поэтому несовместимы со строками, содержащими кириллицу.

Функции введения управляющих символов

Одним из преимуществ языка PHP является то, что он может применяться дня обмена данными почти с любой системой. Средства подобного рода принято рассматривать как своего рода "программный клей". В этой роли язык PHP применяется для взаимодействия с серверами баз данных, серверами LDAP, для обмена данными через сокеты и само соединение HTTP. Зачастую такое взаимодействие осуществляется путем предварительного создания строки сообщения (наподобие запроса к базе данных), а затем передачи этого сообщения в программу-получатель. Но в программах часто придается особый смысл некоторым символам, и поэтому их приходится преобразовывать в управляющие символы. Это означает, что программе-получателю дается указание рассматривать подобные символы как литеральную часть строки, а не применять к ним специальную обработку.

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

Функция addslashes() преобразует одинарные и двойные кавычки, символы обратной косой черты и нуль-символы в управляющие последовательности с помощью символов обратной косой черты, поскольку именно указанные символы обычно приходится преобразовывать в управляющие последовательности при подготовке запросов к базам данных:

$escapedstring = addslashes("Строка с "кавычками"."); $query = "INSERT INTO test (quote) values ("$escapedstring")"; $result = mysqli_query($link, $query) or die(mysql_error());

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

Функция quotemeta() преобразует в управляющие последовательности более широкий набор символов. Все эти символы обычно имеют особый смысл в командной строке Unix: " . ", " " ", " + ", " * ", " ? ", " [ ", " ] ", " ^ ", " (", " $ " и ")". Например, выполнение следующего кода:

$str = "Эти символы ($, *, ^) нужно преобразовать."; echo quotemeta($str);

выводит такую строку:

Функции вывода на внешнее устройство и в строку

Основными конструкциями, применяемыми для вывода, являются print и echo, которые подробно рассматривались ранее. Стандартный способ вывода значений переменных на внешнее устройство состоит в том, чтобы включить имена этих переменных в строку с двойными кавычками (при обработке которой интерпретатором происходит подстановка значений переменных), а затем передать эту строку в конструкцию print или echo.

Если требуется еще более точно отформатированный вывод, то можно воспользоваться предоставляемыми языком PHP функциями printf() и sprintf(). Эти две функции принимают одинаковые параметры: специальную строку формата, за которой следует произвольное количество других параметров, подставляемых в нужные места в строке формата для получения результата. Единственное различие между функциями printf() и sprintf() состоит в том, что printf() отправляет результирующую строку непосредственно на внешнее устройство, применяемое для вывода, a sprintf() возвращает результирующую строку в качестве результата своего выполнения.

Несколько слов для опытных программистов, работающих на языке C. Эта версия функции sprintf() немного отличается от версии из языка C в том, что функции sprintf() не требуется предоставлять распределенную строку, в которую должна осуществляться запись, поскольку интерпретатор PHP распределяет память для результирующей строки от имени пользователя.

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

После знака % находятся пять элементов, входящих в состав спецификации преобразования, которые описаны ниже, причем некоторые из них являются необязательными: заполнение, выравнивание, минимальная ширина, точность и тип:

  • Для указания на то, является ли число отрицательным, применяется необязательное обозначение в виде знака "минус" (-).
  • Единственный (необязательный) символ заполнения представляет собой либо 0, либо пробел (). Этот символ используется для заполнения любого пространства, которое при его отсутствии осталось бы незаполненным, но на выделении которого настаивал пользователь (задавая слишком большое значение параметра минимальной ширины). Если этот символ заполнения не задан, то по умолчанию происходит заполнение пробелами.
  • Необязательный символ выравнивания (-) показывает, должно ли выводимое значение быть выровнено по левому или по правому краю. Если этот символ задан, то значение будет выровнено по левому краю, а при его отсутствии применяется выравнивание по правому краю.
  • Необязательное числовое значение минимальной ширины, которое указывает, какое минимальное количество позиций должно занимать выводимое значение. (Если для вывода значений требуется больше символьных позиций, чем указано, то выводимое значение выходит за эти пределы.)
  • Необязательный спецификатор точности, оформляемый как точка (.), за которой следует число. Спецификатор указывает, с какой точностью, измеряемой количеством десятичных позиций после точки, должно быть выведено число с плавающей точкой двойной точности. (Применение данной спецификации не оказывает никакого влияния при выводе данных, отличных от чисел с плавающей точкой двойной точности.)
  • Единственный символ, указывающий, как должен интерпретироваться тип значения. Символ f указывает, что значение должно быть выведено как число с плавающей точкой двойной точности, символ s указывает, что вывод значения должен осуществляться в виде строкового, а остальные возможные символы (b, c, d, o, x, X) говорят о том, что значение должно интерпретироваться как целочисленное и выводиться в различных форматах. Этими форматами являются b, который обозначает вывод в формате двоичных чисел, c - обусловливающий вывод символа с соответствующим значением кода ASCII, o - который требует вывода в формате восьмеричных чисел, x - для вывода в формате шестнадцатеричных чисел (с буквенными обозначениями цифр в нижнем регистре), и X - для вывода шестнадцатеричных чисел, в которых в качестве буквенных обозначений цифр используются прописные буквы.

Ниже приведен пример вывода одного и того же числа с плавающей точкой двойной точности несколькими разными способами:

 %10f
%-10f
%2.2f", $value, $value, $value, $value); ?>

Он приводит к получению таких результатов:

Применяемая в этом примере конструкция

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

Функции для работы с кодом HTML

В языке PHP предусмотрен целый ряд функций манипулирования со строками, содержащими данные, характерные для веб. Общие сведения об этих функциях приведены в таблице ниже:

Строковые функции, предназначенные для работы с кодом HTML

Функция Описание
htmlspecialchars() Принимает в качестве параметра строку и возвращает строку, в которой четыре символа, имеющие специальное значение в языке HTML, заменены специальными строками. Каждый из этих символов заменяется соответствующим компонентом HTML, который после развертывания текста страницы в браузере снова заменяется первоначальным символом. Символ & заменяется компонентом & символ " (символ двойной кавычки) - компонентом " символ < - < а символ > - >
htmlentities() Осуществляет более полную обработку по сравнению с htmlspecialchars(), т.е. заменяет компонентом HTML не только специальные символы, но и все символы, для которых предусмотрена замена компонентом HTML
get_html_translation_table() Принимает одну из двух специальных констант (HTML_SPECIAL_CHARS или HTML_ENTITIES) и возвращает таблицу преобразования, используемую соответственно функциями htmlspecialchars() или htmlentities(). Таблица преобразования представляет собой массив, ключами которого являются символьные строки, а соответствующими значениями - строки, предназначенные для их замены
nl2br() Принимает в качестве параметра строку и возвращает ту же строку, но с дескрипторами
, вставленным перед всеми символами обозначения конца строки (\n, \r или \r\n). Необходимость в использовании этой функции возникает, например, если требуется обеспечить такое же разбиение на абзацы текста, отображаемого в браузере, как и в исходное тексте
strip_tags() Принимает в качестве параметра строку и выполняет все от нее зависящее для формирования строки, очищенной от всех дескрипторов HTML и всех дескрипторов PHP

Хэширование данных с помощью алгоритма MD5

Алгоритм MD5 представляет собой алгоритм обработки строк, который используется для выработки так называемого дайджеста, или цифровой подписи для любой строки, переданной в качестве параметра. Алгоритм формирует на основе входной строки строку постоянной длины, состоящую из 32 шестнадцатеричных цифр (0-9, a-f). Результаты, формируемые с помощью алгоритма MD5, обладают очень полезными свойствами, описанными ниже:

  • Алгоритм MD5 всегда обеспечивает формирование неизменной выходной строки при получении одной и той же входной строки, поэтому шифрование с помощью MD5 нельзя применять для хранения паролей.
  • Результаты применения алгоритма MD5 имеют фиксированную длину и очень равномерно распространены по всему диапазону возможных значений.
  • Может быть сформирована входная строка, соответствующая заданной выходной строке алгоритма MD5, или созданы две входные строки, обработка которых привела бы к получению одинаковой выходной строки, но лишь при определенных условиях.

Реализация алгоритма MD5 в языке PHP доступна в виде функции md5(), которая принимает в качестве входных данных строку и вырабатывает результаты в виде 32-символьного дайджеста. Например, выполнение следующего кода:

$str = "Hello world!"; echo "Хэш-код для строки "$str": ".md5($str)."
"; $str = "Hello, world!"; echo "Хэш-код для строки "$str": ".md5($str)."
"; $str = "Hello world"; echo "Хэш-код для строки "$str": ".md5($str)."
";

приводит к получению в окне браузера таких результатов:

Безусловно, в данном случае все входные строки весьма напоминают друг друга, но выходные строки не имеют какого-либо видимого сходства. Кроме того, диапазон возможных выходных значений является чрезвычайно огромным (1632), поэтому вероятность совпадения результатов обработки двух различных строк (при котором вырабатывалось бы одно и то же значение MD5) крайне мала.

Благодаря указанным выше характерным особенностям алгоритма MD5 значения, полученные с его помощью, могут применяться для решения самых различных задач, включая описанные ниже:
Вычисление контрольной суммы сообщения или файла
Для проверки того, не произошло ли искажение сообщения во время передачи, можно передать вместе с сообщением дайджест MD5, а после получения сообщения снова сформировать дайджест MD5. Если две версии дайджеста не совпадают, значит, во время передачи были допущены искажения.
Контроль над тем, остается ли содержимое файла неизменным
Эта задача аналогична задаче вычисления контрольной суммы. Алгоритм MD5 часто используется для выполнения такой операции в машинах поиска, если требуется периодически осуществлять проверку того, изменилась ли веб-страница, и в случае необходимости выполнять переиндексацию. Дело в том, что для дальнейшей сверки гораздо проще организовать хранение дайджеста MD5, чем всего исходного файла.
Разбиение множества строк или файлов на подмножества
Для решения задачи разбиения множества строк на N случайно выбранных подмножеств можно вычислить дайджест MD5 каждой строки, взять первые несколько шестнадцатеричных символов, преобразовать их в число, получить остаток от деления этого числа по модулю на количество подмножеств N и использовать этот остаток в качестве номера подмножества, в которое должна быть записана эта строка.

Кроме функции md5(), в языке PHP предусмотрена функция md5_file(), которая принимает в качестве параметра имя файла и возвращает хэшированное значение MD5, соответствующие содержимому файла.

Функции, предназначенные для оценки подобия строк

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

Если в качестве критерия оценки подобия рассматривается сходство в написании, то можно применить метрику Левенштейна . Функция levenshtein() принимает в качестве параметров две строки и возвращает данные о том, какое минимальное количество операций добавления, удаления и замены символов необходимо для преобразования одной строки в другую. Рассмотрим пример:

Echo levenshtein("Tim", "Time"); // 1 echo levenshtein("boy", "chefboyardee"); // 9 echo levenshtein("never", "clever"); // 2

Если в качестве критерия подобия рассматривается фонетическое сходство, то для оценки подобия можно воспользоваться функциями soundex() и metaphone(). Обе эти функции принимают в качестве входного параметра рассматриваемую строку и возвращают ключевую строку с обозначением категории произношения данного слова (которое рассматривается как слово английского языка). Если два слова, используемых в качестве содержимого входной строки, точно соответствуют одному и тому же выходному значению, то они, по всей видимости, должны произноситься одинаково.

Функции синтаксического анализа и разбиения на лексемы

Иногда возникает необходимость обеспечить в программе разбиение строк на компоненты, руководствуясь собственным определением того, что должно рассматриваться в качестве компонента. Процесс разделения длинной строки на части называют разбиением на лексемы. В частности, такой процесс входит в состав общей процедуры интерпретации или компиляции любой компьютерной программы, включая программу на языке PHP. В языке PHP для этой цели предусмотрена специальная функция - strtok().

Функция strtok() принимает два параметра: строку, предназначенную для разбиения на лексемы, и строку, содержащую все разграничители (символы, которые рассматриваются как границы между лексемами). При первом вызове используются оба параметра и функция возвращает строковое значение, представляющее собой первую лексему. Для выборки последующих лексем выполняется такой же вызов, но параметр с исходной строкой исключается. Функция запоминает адрес строки, заданной в первом параметре, и использует ее в качестве текущей строки. Кроме того, эта функция запоминает, в каком месте была прекращена обработка при предыдущем вызове. Рассмотрим следующий пример:

$token = strtok("open-source HTML-embedded server-side Web scripting", " "); while($token) { echo $token."
"; $token = strtok(" "); }

который приводит к получению в окне браузера такого вывода:

Разбиение исходной строки осуществляется в том месте, где находится каждый пробел.

Функция strtok() формирует лексемы одну за другой. Можно также воспользоваться функцией explode(), которая выполняет примерно аналогичные действия, не считая того, что она сохраняет сразу все лексемы в одном массиве. После получения лексем, представленных в виде массива, с ними можно выполнять любые операции, включая сортировку.

Функция explode() принимает два параметра: разделительную строку и строку, которая должна быть разделена на лексемы. Эта функция возвращает массив, каждый элемент которого представляет собой подстроку, находящегося между экземплярами разделителя в строке, подлежащей разделению. Рассмотрим следующий пример:

$explodeResult = explode("AND", "one AND a two AND a three");

который приводит к получению массива $explode_result, содержащего три элемента, каждый из которых представляет собой строку: "one ", " a two " и " a three". В данном конкретном примере не встречается ни одной прописной буквы в какой-либо из строк, содержащихся в массиве, поскольку разделитель AND не присутствует в результате.

Разделительная строка, применяемая в функции explode(), в значительной степени отличается от строки с разграничителями, используемой в функции strtok(). Разделитель представляет собой полноценную строку, поэтому все символы этой строки должны быть найдены в исходной строке в том же порядке, что и в разделителе, чтобы можно было считать этот разделитель обнаруженным.

С другой стороны, строка с разграничителями в функции strtok() задает множество отдельных символов, каждый из которых рассматривается как разграничитель. Это означает, что функция explode() действует более избирательно, но в большей степени подвержена нарушениям в работе. В частности, если в длинной строке будет случайно пропущен даже единственный пробел или символ обозначения конца строки, входящий в состав разделителя, то может быть нарушена вся работа этой функции.

Функция explode() имеет обратную по отношению к ней функцию, implode(), которая принимает два параметра: соединительную строку (аналогичную разделительной строке в функции explode()) и массив строк, подобный тому, который возвращает функция explode(). Функция implode() возвращает строку, созданную путем вставки соединительной строки между всеми подряд идущими строковыми элементами в массиве.

Значениями типа string являются текстовые строки (кратко строки). Строка — это последовательность из нуля или более символов. Символы включают в себя буквы, цифры, знаки пунктуации, специальные символы и пробелы.

Строка может быть определена четырьмя различными способами:

  • двойными кавычками
  • одинарными кавычками
  • heredoc-синтаксисом
  • nowdoc-синтаксисом

Строка в двойных кавычках

Строка в двойных кавычках:

В строках с двойными кавычками можно использовать управляющие последовательности. Управляющая последовательность — это специальные символы предназначенные для форматирования текстового вывода. В PHP доступны следующие управляющие последовательности:

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


Знак доллара: \$";

Строки, заключённые в двойные кавычки, могут содержать символы одинарных кавычек:

Echo "Одинарная кавычка: "";

Строка в одинарных кавычках (апострофах)

Строка в одинарных кавычках:

$str = "Строка"; echo "Одну большую строку можно разбить на несколько маленьких строк, чтобы её было удобнее читать.";

В отличие от строк в двойных кавычках и heredoc-синтаксиса, переменные и управляющие последовательности (за одним исключением), заключённые в одинарные кавычки, не обрабатываются. Это означает, что они будут интерпретированы как обычные символы строки:

$num = 10; echo "Число: $num
Знак доллара: \$";

Чтобы в строке, заключённой в одинарные кавычки, можно было использовать одинарные кавычки, нужно их экранировать с помощью обратного слэша (\"). Если необходимо написать саму обратную косую черту, нужно продублировать её (\\):

Echo "Внутри используются \"одинарные\" кавычки"; echo "Обратный слэш: \\";

Строки, заключённые в одинарные кавычки, могут содержать символы двойных кавычек:

Echo "Двойная кавычка: "";

Heredoc-синтаксис

Heredoc-синтаксис — это альтернативный способ записи строк.

Строка, определяемая с помощью Heredoc-синтаксиса, работает также, как и строка, расположенная в двойных кавычках. Разница между Heredoc и строкой в двойных кавычках заключается в том, что используя Heredoc нет необходимости экранировать двойные кавычки.

Heredoc-синтаксис начинается с трёх символов <<< , после которых должен быть указан произвольный идентификатор (назовём его открывающим). Идентификатор может быть указан как в двойных кавычках, так и без них. Сразу после идентификатора должен следовать перевод на новую строку, никаких других символов кроме перевода на новую строку после идентификатора не должно быть, иначе возникнет ошибка. Далее идёт непосредственно строковое содержимое. После строкового содержимого, на отдельной строке, должен быть указан закрывающий идентификатор (тот же, что и после <<<). Перед ним и после него не должно быть никаких пробелов или других символов, за исключением точки с запятой. Если это правило нарушено, то считается, что закрывающий идентификатор отсутствует и будет вызвана ошибка:

<<

Nowdoc-синтаксис

Nowdoc-синтаксис также как и Heredoc является альтернативным способом записи строк.

Строка, определяемая с помощью Nowdoc-синтаксиса, работает также, как и строка, расположенная в одинарных кавычках. Разница между Nowdoc и строкой в одинарных кавычках заключается в том, что используя Nowdoc нет необходимости экранировать одинарные кавычки.

Синтаксис Nowdoc похож на Heredoc с той лишь разницей, что открывающий идентификатор обязательно должен быть заключён в одинарные кавычки:

$num = 10; echo <<<"some_id" Число: $num some_id;

Обработка переменных в строках

Существует два типа синтаксиса обработки переменных в строках: простой и сложный .

Простой синтаксис — это когда имя переменной указывается в строке как есть.

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

$str = "World!"; echo "Hello $str";

Сложный синтаксис — это когда имя переменной заключается в фигурные скобки.

Так как, для обработки переменной в строке, интерпретатор захватывает так много символов, на сколько это возможно бывают ситуации когда интерпретатор не способен самостоятельно определить, где оканчивается имя переменной:

$sport1 = "волей"; $sport2 = "фут"; echo "Мне нравится $sport1бол и $sport2бол";

В данном случае не будет достигнут желаемый результат, поскольку интерпретатор будет считать $sport1 как часть имени переменной $sport1бол, которой не существует.

Чтобы явно указать интерпретатору, где оканчивается имя переменной требуется заключить имя переменной в фигурные скобки:

$sport1 = "волей"; $sport2 = "фут"; echo "Мне нравится {$sport1}бол и {$sport2}бол.";

Знак доллара может быть расположен как перед фигурной скобкой, так и после неё:

$sport1 = "волей"; $sport2 = "фут"; echo "Мне нравится ${sport1}бол и {$sport2}бол.";

Конкатенация

Конкатенация — это объединение двух или более строк в одну большую. Объединение происходит с помощью оператора конкатенации — . (точка). При конкатенации каждая последующая строка добавляется в конец предыдущей:

Значение любого типа, которое объединяется со строкой, будет неявно преобразовано в строку и далее будет произведена конкатенация:

"; echo "Число: " . 1; ?>



Таблицы:

C_id | Company | Location
1 | ООО Поиск | Кудыкино поле 15/3
2 | ЗАО Элита | Слунысвалинск 133/7
3 | ОАО Пыщпыщ | Солдатодачестройское 404

Тип ремонта (repair_types)
r_id | Repair_types |
1 | Молоток + гвозди
2 | Наведение красоты
3 | Капитальный ремонт

Список заказов (list)
l_id | Who | What need | Time | Operator comment
1 | 1 | 2 | %timestamp% | %текст_оператора%
2 | 2 | 1 | | %text%
3 | 3 | 2 | | %text%

Таблица № 1 содержит список клиентов.
Таблица № 2 содержит список услуг.
Таблица № 3 содержит список текущих заказов для оперативных бригад. Данная таблица регулярно обновляется и для её заполнения используется веб-форма. Так как Приходит довольно много заказов, то в таблицу заносятся записи в виде ID клиента и услуги.

Собственно проблема в том, что третья таблица должна выводиться в веб-форме "выбор заказа" и вместо ID нужно подставить соответствующие поля из других столбцов.

Код:
$query = "SELECT * FROM list";
$result = mysql_query ($query);
while($row=mysql_fetch_array($result. // берем результаты из каждой строки
{ echo "";// выводим данные
}




CREATE TABLE "table_name" ("id" int(255) NOT NULL AUTO_INCREMENT, "list" text (80) NOT NULL, PRIMARY KEY("id".

INSERT INTO "table_name" ("list") VALUES ("bla-bla")



лучший ответ $query =
"
select companies.Company, repair_types.Repair_types, list.comment_l
from list
inner join companies
on list.Who = companies.c_id
inner join repair_types
on list."What need" = repair_types.r_id
";

PHP, в настоящее время, – один из наиболее популярных языков для реализации веб-приложений. Данный курс посвящен изучению его основ. Акцент делается на практическое применение полученных навыков.

Язык PHP был создан для решения конкретной практической задачи в среде интернет (какой именно можно узнать, прочитав первую лекцию курса). Мы тоже постараемся не отвлекаться слишком сильно на теоретические рассуждения, и будем стремиться к решению какой-нибудь конкретной задачи в каждой из лекций. Большинство примеров взяты из реально существующей системы: виртуального музея истории информатики. Первая часть курса посвящена изучению основ синтаксиса и управляющим конструкциям. После этого рассматривается технология клиент-сервер, как основная сфера приложения языка PHP. Затем переходим к изучению наиболее полезных на наш взгляд встроенных функций и решению с их помощью практических задач. Хотя объектная модель в языке PHP не самая богатая, ее принципиальное наличие позволяет естественным образом описывать объектные модели данных. В качестве базовой модели будет рассмотрена модель документа виртуального музея информатики. После этого будет рассмотрен ряд прикладных аспектов: работа с файловой системой, с БД, строками, сессиями, DOM XML - все это позволит рассмотреть ключевые задачи практического использования языка.

Книга:

Использование шаблонов в PHP

Использование шаблонов в PHP

Что такое шаблоны и зачем они нужны

Что такое шаблон в языке программирования? Можно сказать, что шаблон - это текст с переменными внутри него. При обработке шаблона происходит замена переменных на их значения.

В одной из лекций мы уже рассматривали пример шаблона. Это был шаблон для отображения документов. Пользователь создавал строку текста, размеченного с помощью html-тегов, и вставлял в нее специальные метасимволы (вида ), которые наша программа впоследствии заменяла на значения соответствующих элементов. Для чего нам был нужен такой шаблон? Чтобы, например, можно было изменить стиль отображения документа, не меняя кода программы.

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

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

Итак, задача:

Требуется сгенерировать web-страницу со списком статей, имеющихся в базе данных. Для простоты считаем, что статья имеет название title, автора author, краткое содержание abstract и полное содержание fulltext, которое представлено либо в виде текста в базе данных, либо в виде ссылки на файл. Список должен быть организован так, чтобы при щелчке мышью на названии статьи ее полное содержание появлялось в новом окне.

Шаблоны подстановки

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

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

  • "
    target=new>
    ()

    Кроме того, здесь есть еще одна загвоздка - с отображением ссылки на полный текст статьи. Если мы будем действовать по правилу подстановки (менять все метасимволы на их значения из базы данных), то может получиться, что вместо вставим не ссылку на текст, а сам текст. То есть для этого элемента нужна дополнительная проверка перед заменой и какие-то дополнительные действия в случае, если в поле fulltext содержится текст статьи, а не ссылка на файл. Не будем усложнять себе жизнь и договоримся, что в поле fulltext всегда содержится только ссылка на файл. Тогда задачу можно решить следующим образом:

    $li_tmpl = file_get_contents("tmpl.html");
    // считываем шаблон строки из файла
    // устанавливаем соединение и выбираем
    // базу данных
    $conn = mysql_connect("localhost",
    "nina","123")
    or die("Cant connect");
    mysql_select_db("book");
    $sql = "SELECT * FROM Articles";
    $q = mysql_query($sql,$conn);
    // отправляем запрос
    $num = mysql_num_rows($q);
    for($i=0; $i<$num; $i++){
    $tmpl .= $li_tmpl;
    $tmpl = str_replace("",
    mysql_result($q,$i,"title"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"author"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"abstract"),$tmpl);
    $tmpl = str_replace("",
    mysql_result($q,$i,"fulltext"),$tmpl);
    }
    echo $tmpl;
    ?>

    Если шаблон был такой, как приведен выше, то получим примерно следующее.

    Введение в PHP (Савельева Н.В.)

    Лекция дает представление о том, что такое язык PHP, для чего он создавался изначально и как используется теперь, какими возможностями обладает.

    Установка и настройка ПО (Иванов Иван)

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

    Шаблоны FastTemplate

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

    Что представляет собой файл шаблона FastTemplate? Это обычный html-файл, в котором могут встречаться переменные особого вида, впоследствии обрабатываемые методами класса FastTemplate.

    Синтаксис переменных в шаблонах FastTemplate описывается следующим выражением: {(+)}

    Это значит, что переменная должна начинаться с фигурной скобки "{". Второй и последующие символы должны быть буквами верхнего регистра от A до Z, цифрами или символами подчеркивания. Переменная вычисляется с помощью закрывающей фигурной скобки "}".

    {TITLE}
    {AUTH20}
    {TOP_OF_PAGE}

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


    {TITLE_}


    {MAIN}



      {LIST_ELEMENT}

  • {TITLE}
    ({AUTHOR})

    {ABSTRACT}

    Шаблоны мы создали - работу дизайнера выполнили. Теперь нужно научиться их обрабатывать, т.е. выполнить работу программиста. Сейчас создадим программу для обработки приведенных выше шаблонов.

    Перед началом работы с шаблонами FastTemplate нужно подключить этот набор классов к нашей программе. В реальной жизни набор классов FastTemplate записан в один файл, как правило, с названием class.FastTemplate.php3, поэтому подключить его можно, например, с помощью команды:

    include("class.FastTemplate.php3");

    Следующий важный шаг - это создание объекта класса FastTemplate, с которым впоследствии мы будем работать:

    $tpl = new FastTemplate(
    "/path/to/templates");

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

    Для работы с FastTemplate нужно знать четыре основных метода: define, assign, parse и FastPrint.

    Метод define

    Синтаксис:

    define(array (ключ => значение,
    ключ1 => значение1, ...))

    Метод define() связывает имя файла шаблона с более коротким именем, которое можно будет использовать в программе. То есть "ключ" - это имя, которое мы будем использовать в программе для ссылки на файл шаблона, имя которого записано в строке "значение". Реальные имена файлов шаблонов не рекомендуется использовать нигде, кроме метода define. При вызове метода define() происходит загрузка всех определенных в нем шаблонов.

    $tpl->define(array (main => "main.tpl",
    list_f => "list.tpl",
    list_el=> "list_element.tpl"));

    Здесь мы задаем псевдонимы именам файлов шаблонов. Эти псевдонимы, т.е. переменные main, list_f и list_el, будут использоваться в программе вместо соответствующих имен файлов main.tpl, list.tpl и list_element.tpl.

    Метод assign

    Синтаксис:

    assign((пары ключ/значение) или
    (array(пары ключ/значение))

    Метод assign() присваивает переменным значения, "ключ" - это имя переменной, а "значение" - значение, которое ей нужно присвоить. Чтобы переменная в шаблоне была заменена значением, это значение нужно задать ей с помощью метода assign(). Согласно синтаксису этот метод можно использовать в двух различных формах. В FastTemplate есть только один массив, поэтому, если вы повторно задаете значение одному и тому же ключу, оно будет перезаписано.

    $tpl->assign(array(
    TITLE => "Установка и настройка ПО",
    TITLE => "Введение в PHP"));

    Здесь мы дважды устанавливаем значение переменной, доступной в файлах шаблона по имени TITLE. Эта переменная будет иметь последнее присвоенное ей значение, т.е. она равна строке "Введение в PHP".

    Метод parse

    Синтаксис:

    parse (возвращаемая переменная,
    источники шаблонов)

    Метод parse() - самый основной в FastTemplate. Он устанавливает значение возвращаемой переменной равным обработанным шаблонам из указанных источников. Метод может использоваться в трех формах: простой, составной и присоединяющей.

    $tpl->parse(MAIN, "main");
    // простая форма
    $tpl->parse(MAIN, array ("list_f", "main"));
    // составная форма
    $tpl->parse(MAIN, ".list_el");
    // присоединяющая форма

    В простой форме шаблон с псевдонимом "main" загружается (если еще не был загружен), все его переменные подставляются, и результат сохраняется как значение переменной MAIN. Если переменная {MAIN} появится в более поздних шаблонах, то вместо нее будет подставлено значение, полученное в результате обработки шаблона "main". Это позволяет создавать вложенные шаблоны.

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

    $tpl->parse(MAIN, "list_f");
    $tpl->parse(MAIN, ".main");

    это то же самое что и

    $tpl->parse(MAIN, array("list_f", "main"));

    Когда используется составная форма, важно, чтобы каждый шаблон, идущий в списке после первого, содержал ту переменную, в которую передаются результаты обработки шаблона. В примере выше main должен содержать переменную {MAIN}, поскольку именно в нее передаются результаты обработки шаблона list_f. Если main не содержит переменной {MAIN}, то результаты обработки шаблона list_f будут потеряны.

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

    Метод FastPrint

    Синтаксис:

    FastPrint(обработанная переменная)

    Метод FastPrint() печатает содержимое переданной в него обработанной переменной. Если он вызван без параметров, то печатается последняя использованная методом parse() переменная.

    $tpl->FastPrint();
    /* если продолжать предыдущий пример,
    то эта функция напечатает значение
    переменной MAIN */
    $tpl->FastPrint("MAIN");
    // эта функция сделает тоже самое

    Если нужно печатать не на экран, а, например, в файл, то получить ссылку на данные можно с помощью метода fetch().

    $data = $tpl->fetch("MAIN");
    fwrite($fd, $data); // запись данных в файл

    Решение задачи с помощью шаблонов FastTemplate

    Теперь попробуем собрать воедино все изученные методы, чтобы решить нашу задачу.

    Заметим, что решение задачи получилось несколько более сложным, чем в первом случае, когда использовалась только функция регулярной замены. Зато здесь мы можем изменять три различных шаблона (документа в целом, списка и элемента списка).

    Этот класс шаблонов появился еще до выхода PHP4 для работы с PHP3. Чтобы протестировать приведенные примеры, нужно скачать библиотеку классов FastTemplate и скопировать этот файл в свою рабочую директорию. Если вы работаете с PHP4, то в файл class.FastTemplate.php3 нужно внести пару изменений, о которых написано в документации, поставляющейся вместе с этой библиотекой.

    Шаблоны Smarty

    Smarty - один из действующих проектов PHP, его официальный сайт - http://smarty.php.net. Там можно скачать как сам набор классов Smarty, так и документацию к нему. Этот набор классов для обработки шаблонов - гораздо более мощный и функциональный, чем FastTemplate.Чем отличается Smarty от классов шаблонов типа FastTemplate? Прежде всего, он не отделяет полностью логику от содержания. Логика, касающаяся отображения данных, может присутствовать в шаблоне, считают разработчики Smarty. Поэтому в шаблоне Smarty могут быть условные операторы, операторы вставки файлов, операторы изменения переменных, циклы и т.п. Другая особенность Smarty - это компиляция шаблонов. Шаблоны переводятся в php-код, и интерпретатор PHP производит все необходимые действия по подстановке значений. Для ускорения работы скомпилированные шаблоны кэшируются.

    Рассмотрим некоторые основные конструкции механизма шаблонов Smarty.

    Установка

    Первое, с чего мы начнем, - это установка Smarty. Здесь все не так просто, как с FastTemplate. Smarty состоит не из одного php-файла с описанием класса, а из целого набора различных файлов-библиотек. Для того чтобы работать с шаблонами Smarty, нужно сделать эти библиотеки доступными для всех ваших программ. Находятся они в каталоге /libs/ дистрибутива Smarty. Файл, в котором содержится определение самого класса Smarty, называется Smarty.class.php. Чтобы проверить, доступны ли библиотеки класса Smarty, нужно написать такой скрипт:

    require("Smarty.class.php");
    // подключаем файл с
    // описанием класса Smarty
    $smarty = new Smarty;
    // создаем экземпляр класса Smarty
    ?>

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

    // подключаем файл с описанием класса
    require("c:/users/my/Smarty/libs/
    Smarty.class.php");
    $smarty = new Smarty;
    // создаем экземпляр класса Smarty
    ?>

    Добавить директорию, где содержатся библиотеки, в include_path (в этом случае код менять не нужно).

    define("SMARTY_DIR",
    "c:/users/my/Smarty/libs/index.html");
    require(SMARTY_DIR."Smarty.class.php");
    $smarty = new Smarty;
    ?>

    Теперь, после того как мы убедились, что библиотеки будут найдены, нужно создать директории, необходимые для работы Smarty, по умолчанию имеющие такие имена:

    Templates - директория, где мы будем хранить созданные шаблоны;

    Templates_c - директория, где Smarty будет хранить скомпилированные шаблоны;

    Configs - директория для хранения конфигурационных файлов;

    Cache - директория для кэша.

    Эти имена задаются свойствами $template_dir, $compile_dir, $config_dir, $cache_dir класса Smarty, поэтому их можно переопределить. Рекомендуется использовать различные наборы директорий для каждого приложения, работающего с шаблонами Smarty. Доступ к перечисленным директориям осуществляется библиотекой Smarty и никогда не выполняется напрямую через web-браузер. Поэтому, чтобы избежать проблем с безопасностью, лучше всего разместить эти директории там, куда нет доступа через www.

    Создадим перечисленные Smarty директории по адресу c:/smarty_dirs/book/. Заметим, что прочитать отсюда данные через браузер нельзя. Пусть наша программа (или приложение) находится по адресу /~my/tasks/book/. Для директорий $compile_dir и $cache_dir Smarty потребуется доступ на запись, так что нужно установить соответствующие им права для сетевого пользователя, с которым ваш сервер работает по умолчанию (обычно это www или nobody).

    Чтобы протестировать сделанные настройки, создадим простой шаблон и программу, обрабатывающую его с использованием механизма Smarty.

    index.tpl (является Smarty шаблоном и находится в директории шаблонов c:/smarty_dirs/book/templates/)

    {* Шаблон Smarty *}
    Привет, {$name}!

    index.php (является кодом нашей программы и находится в директории /~my/tasks/book/ или, что то же самое, в директории c:/users/my/tasks/book/)

    В результате должны получить:

    Привет, Вася!

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

    Основной синтаксис

    Smarty - не просто класс для обработки шаблонов, он определяет целый язык построения шаблонов. Мы коснемся только основных его элементов. Итак, что представляет собой шаблон Smarty? Это набор специальных конструкций (переменных, вызовов функций и методов и т.п) и html-тегов. Все элементы (теги) языка шаблонов Smarty заключаются между символами-ограничителями. По умолчанию это символы фигурных скобок "{" и "}", но их можно изменить. Все, что не заключено в такие ограничители, Smarty рассматривает как константы, не требующие обработки. В шаблоне index.tpl, приведенном выше, {$name} - это переменная, а строки "Привет," и "!" - не изменяющиеся в процессе обработки шаблона константы.

    Комментарии в Smarty записываются между двумя звездочками:

    {* Это комментарий. После обработки шаблона
    он на экране не отображается *}

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

    {имя_функции атрибут1="значение1"
    атрибут2="значение2"}

    Переменные в шаблоне могут быть нескольких типов:

    Переменные, значение которым присваивается в php-скрипте пользователя, должны иметь перед именем знак доллара.

    Например: {$first_name}

    Элементы массива, значения которых были присвоены в php-скрипте пользователя, доступны в шаблоне с помощью синтаксиса {$имя_массива.ассоциативный_ключ}.

    Например: {$person.last_name}

    Элементы не ассоциативного массива доступны с помощью синтаксиса квадратных скобок: {имя_массива[числовой_индекс]}

    Например: {$person}

    Свойства объектов, заданные в php-скрипте, доступны в шаблоне с помощью такого синтаксиса: {имя_объекта->имя_свойства}

    Например: {$person->email}

    Переменные, загруженные из конфигурационных файлов (что это такое, мы расскажем чуть позже), заключаются между символами #. Также они доступны как элементы ассоциативного массива $smarty.config.

    Например: {#bodyBgColor#} или {$smarty.config.bodyBgColor}

    Кроме того, существует переменная {$smarty}, зарезервированная для некоторых специальных переменных шаблона, таких как переменные HTTP запроса, даты и времени, и т.п.

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

    Например, чтобы перевести значение переменной {$title} в верхний регистр, нужно применить к ней модификатор upper, т.е. написать следующее: {$title|upper}

    Можно использовать сразу несколько модификаторов, отделяя их друг от друга прямой вертикальной чертой. Например, {$title|upper|truncate} переведет значение переменной в верхний регистр и урежет до 80 символов.

    Перечислять все имеющиеся модификаторы мы не будем. Их список можно найти в документации Smarty. Скажем только, что с их помощью можно посчитать число символов, слов и параграфов, дописать строку, задать формат вывода даты и времени, сделать регулярную замену и многое другое.

    Конфигурационные файлы

    Конфигурационные файлы используются для того, чтобы управлять глобальными переменными, используемыми в шаблоне, с помощью одного файла. Их идея очень похожа на таблицы стилей css. Конфигурационный файл содержит набор переменных и их значения. Перед именем переменной не ставится никаких дополнительных символов типа знака доллара. Значение переменной по желанию заключают в кавычки (двойные или одинарные), если оно состоит из нескольких строк, то его заключают в тройные кавычки.

    # глобальные переменные
    pageTitle = "List of documents"
    bodyBgColor = #000000
    tableBgColor = #000000
    rowBgColor = #00ff00
    pageTitle = "Список статей"
    Intro = """Это значение состоит из
    нескольких строк. Поэтому его нужно
    заключить в тройные кавычки."""
    # скрытая секция
    [.Database]
    host=localhost
    db=book
    user=nina
    pass=123

    Конфигурационный файл может состоять из нескольких разделов (секций), каждая из которых имеет имя и может загружаться отдельно от остальных секций. Имя секции заключается в квадратные скобки. Кроме секций в конфигурационном файле могут содержаться глобальные переменные - они не входят ни в одну секцию и всегда загружаются при загрузке конфигурационного файла. Если загружается какая-то одна секция, то загружаются ее переменные и глобальные переменные. Если переменная существует и как глобальная переменная, и как переменная секции, то используется переменная секции. Если вы одинаково назовете две переменные внутри одной секции, то будет использоваться последняя из них. В приведенном выше примере две секции - Customer и Database, а кроме них заданы глобальные переменные pageTitle, bodyBgColor, tableBgColor и rowBgColor.

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