Нина Савельева - Курс "Язык программирования PHP"
<?php
$tmpl = $_GET["shablon"];
/* шаблон, введенный пользователем.
Например, это может быть такая строка:
"<h1><!title></h1>
<font
size=-1><!description></font>
<palign=right><!author><br><!published>
" */function Show(){
// функция, которая производит замену
// элемента шаблона на его значение
global $tmpl;
foreach($_GET as $k => $v) {
$tmpl = str_replace("<!$k>",$v,$tmpl);
}
echo $tmpl;
}
Show();
?>
Как эти файлы выглядят для обычного пользователя? Если мы введем в форму такие данные как показано на рисунке 8.1, то в результате получим:
Первая машина для переписи населения
Идея наносить данные на перфокарты и затем
считывать и обрабатывать их автоматически
принадлежала Джону Биллингсу, а ее
техническое решение осуществил Герман
Холлерит. Перфокарта Холлерита оказалась
настолько удачной, что без малейших изменений
просуществовала до наших дней.
А. М. Федотов
12.02.03
Рис. 8.1. Форма для ввода описания документа «статья» и шаблона для его отображения
Функция substr_replace
Эта функция сочетает в себе свойства двух уже рассмотренных нами функций – функции str_replace() и substr(). Ее синтаксис таков:
substr_replace (исходная строка,
строка для замены,
позиция начального символа [, длина])
Эта функция заменяет часть строки строкой, предназначенной для замены. Заменяется та часть строки (т.е. подстрока), которая начинается с позиции, указанной параметром позиция начального символа. С помощью дополнительного аргумента длина можно ограничить число заменяемых символов. То есть, фактически, мы не указываем конкретно строку, которую нужно заменить, мы только описываем, где она находится и, возможно, какую длину имеет. В этом отличие функции substr_replace() от str_replace().
Как и в случае с функцией substr() аргументы позиция начального символа и длина могут быть отрицательными. Если позиция начального символа отрицательна, то замена производится, начиная с этой позиции относительно конца строки. Отрицательная длина задает, сколько символов от конца строки не должно быть заменено. Если длина не указывается, то замена происходит до конца строки.
<?php
$text = "Меня зовут Вася.";
echo "Исходная строка: $text<hr>n";
/* Следующие две строки заменят всю
исходную строку строкой 'А меня – Петя' */
echo substr_replace($text, 'А меня – Петя',
0) . "<br>n";
echo substr_replace($text, 'А меня – Петя',
0, strlen($text)) . "<br>n";
// Следующая строка добавит слово 'Привет! '
// в начало исходной строки
echo substr_replace($text, 'Привет! ',
0, 0) . "<br>n";
// Следующие две строки заменят имя Вася
// на имя Иван в исходной строке
echo substr_replace($text, 'Иван', 11,
-1) . "<br>n";
echo substr_replace($text, 'Иван', -5,
-1) . "<br>n";
?>
В результате работы этого скрипта получим:
Исходная строка: Меня зовут Вася.
------------------------------------------
А меня – Петя
А меня – Петя
Привет! Меня зовут Вася.
Меня зовут Иван.
Меня зовут Иван.
Разделение и соединение строки
Очень полезные функции – функция разделения строки на части и обратная ей функция объединения строк в одну строку. Почему очень полезные? Например, если вы динамически генерируете форму по желанию пользователя, можно предложить ему вводить элементы для создания списка выбора, разделяя их каким-нибудь символом. И для того чтобы обработать полученный список значений, как раз и пригодится умение разбивать строку на кусочки. Для реализации такого разбиения в PHP можно использовать несколько функций:
explode(разделитель,исходная строка
[,максимальное число элементов])
split (шаблон, исходная строка
[, максимальное число элементов])
preg_split (шаблон, исходная строка
[, максимальное число элементов
[,флаги]])
Последние две функции работают с регулярными выражениями, поэтому в данной лекции мы их рассматривать не будем. Рассмотрим более простую функцию – explode().
Функция explode() делит исходную строку на подстроки, каждая из которых отделена от соседней с помощью указанного разделителя, и возвращает массив полученных строк. Если задан дополнительный параметр максимальное число элементов, то число элементов в массиве будет не больше этого параметра, в последний элемент записывается весь остаток строки. Если в качестве разделителя указана пустая строка «""», то функция explode() вернет false. Если символа разделителя в исходной строке нет, то возвращается исходная строка без изменений.
Пример 8.11. мы хотим создать элемент формы – выпадающий список и значения для этого списка должен ввести пользователь, не знакомый с языком html. Создадим такую форму:
<form action=exp.php>
Введите варианты для выбора автора статьи
через двоеточие (":"):<br>
<input type=text name=author size=40>
<br>
<input type=submit value=Создать элемент>
</form>
Скрипт, который будет ее обрабатывать (exp.php), может быть таким:
<?php
$str = $_GET["author"];
$names = explode(":",$str);
// разбиваем строку введенную,
// пользователем с помощью ":"
$s = "<select name=author>";
// создаем выпадающий список
foreach ($names as $k => $name) {
$s .= "<option value=$k>$name";
// добавляем элементы к списку
}
$s .= "</select>";
echo $s;
?>
В итоге, если мы введем такую строчку в форму:
Рис. 8.2. Ввод значений для создания выпадающего списка
то получим следующий выпадающий список:
Рис. 8.3. Выпадающий список, полученный в результате обработки формы
Кроме разделения строки на части иногда, наоборот, возникает необходимость объединения нескольких строк в одно целое. Функция, предлагаемая для этого языком PHP, называется implode():
implode (массив строк, объединяющий элемент)
Эта функция объединяет элементы массива с помощью переданного ей объединяющего элемента (например, запятой). В отличие от функции explode(), порядок аргументов в функции implode() не имеет значения.
Пример 8.12. Допустим, мы храним имя, фамилию и отчество человека по отдельности, а выводить их на странице нужно вместе. Чтобы соединить их в одну строку, можно использовать функцию implode():
<?php
$data = array("Иванов","Иван","Иванович");
$str = implode($data," ");
echo $str;
?>
В результате работы этого скрипта получим строку:
Иванов Иван Иванович
У функции implode() существует псевдоним – функция join(), т.е. эти две функции отличаются лишь именами.
Строки, содержащие html-код
Достаточно часто мы работаем со строками, содержащими html-теги. Если отобразить такую строку в браузер с помощью обычных функций отображения данных echo() или print(), то мы не увидим самих html-тегов, а получим отформатированную в соответствии с этими тегами строку. Браузер обрабатывает все html-теги в соответствии со стандартом языка HTML. Иногда нам нужно видеть непосредственно строку, без обработки ее браузером. Чтобы этого добиться, нужно перед тем, как выводить, применить к ней функцию htmlspecialchars().
Функция htmlspecialchars (строка [, стиль кавычек [, кодировка]]) переводит специальные символы, такие как «<», «>», «&», «"» , «'» в такие сущности языка HTML, как «<», «>», «&», «"», «'» соответственно.
Дополнительный аргумент стиль кавычек определяет, как должны интерпретироваться двойные и одинарные кавычки. Он может иметь одно из трех значений: ENT_COMPAT, ENT_QUOTES, ENT_NOQUOTES. Константа ENT_COMPAT означает, что двойные кавычки должны быть переведены в спецсимволы, а одинарные должны остаться без изменений. ENT_QUOTES говорит, что должны конвертироваться и двойные и одинарные кавычки, а ENT_NOQUOTES оставляет и те и другие кавычки без изменений.
В параметре кодировка могут быть заданы такие кодировки, как UTF-8, ISO-8859-1 и другие, но ни одна русская кодировка здесь не поддерживается.