Лабораторная работа 3. Разработка скриптов для генерации страниц
Скачать 248.71 Kb.
|
1.8e308 с точностью около 14 десятичных цифр (это 64-битный IEEE-формат). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| | | | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var_ | dump((bool) ""); | // bool(false) | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var_dump((bool) 1); | // bool(true) | | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var_dump((bool) -2); | // bool(true) | | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var_dump((bool) "foo"); | // bool(true) | | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| var_dump((bool) 2.3e5); | // bool(true) | | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var_dump((bool) array(12)); | // bool(true) | | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var_dump((bool) array()); | // bool(false) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var_dump((bool) "false"); | // bool(true) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?> | | | |
echo "He drank some $beers"; // | не работает, 's' это | ||
верный символ для имени переменной | | ||
echo "He drank some ${beer}s"; // | работает | | |
echo "He drank some {$beer}s"; // | работает | | |
?> | | | |
Точно также могут быть обработаны элемент массива (array) или свойство объекта (object). В индексах массива закрывающая квадратная скобка (]) обозначает конец определения индекса. Для свойств объекта применяются те же правила, что и для простых переменных, хотя с ними невозможен трюк, как с переменными.
Эти примеры специфически об использовании массивов в нутри
строк. Вне строк всегда заключайте строковые ключи в ашего
массива в кавычки и не используйте вне строк {скобки
}.
Давайте покажем все ошибки error_reporting(E_ALL);
$fruits = array('strawberry' => 'red', 'banana' => 'yel low');
Работает, но заметьте, что вне кавычек строки это ра ботает по-другому
echo "A banana is $fruits[banana].";
//Работает
echo "A banana is {$fruits['banana']}.";
Работает, но PHP, как описано ниже, сначала ищет
константу banana.
echo "A banana is {$fruits[banana]}.";
Не работает, используйте фигурные скобки. Это вызове т ошибку обработки.
echo "A banana is $fruits['banana'].";
Работает
echo "A banana is " . $fruits['banana'] . ".";
Работает
echo "This square is $square->width meters broad.";
Не работает. Для решения см. сложный синтаксис. echo "This square is $square->width00 centimeters broad."; ?>
Для более сложных задач вы можете использовать сложный синтаксис.
Сложный (фигурный) синтаксис
Данный синтаксис называется сложным не потому, что труден в понимании, а потому что позволяет использовать сложные выражения.
Фактически, вы можете включить любое значение, находящееся в пространстве имени в строке с этим синтаксисом. Вы просто записываете выражение таким же образом, как и вне строки, а затем заключаете его в {
}. Поскольку вы не можете экранировать '{', этот синтаксис будет распознаваться только когда $ следует непосредственно за {. (Используйте "{\$" или "\{$" чтобы отобразить "{$"). Несколько поясняющих примеров:
Давайте покажем все ошибки error_reporting(E_ALL);
$great = 'fantastic';
Не работает, выведет: This is { fantastic} echo "This is { $great}";
Работает, выведет: This is fantastic echo "This is {$great}";
echo "This is ${great}";
Работает
echo "Этот квадрат шириной {$square->width}
сантиметров.";
Работает
echo "Это работает: {$arr[4][3]}";
Это неверно по той же причине, что и $foo[bar] невер но вне
строки. Другими словами, это по-
прежнему будет работать,
но поскольку PHP сначала ищет константу foo, это выз овет
ошибку уровня E_NOTICE (неопределенная константа). echo "Это неправильно: {$arr[foo][3]}";
Работает. При использовании многомерных массивов, вн утри
строк всегда используйте фигурные скобки
echo "Это работает: {$arr['foo'][3]}";
Работает.
echo "Это работает: " . $arr['foo'][3];
echo "Вы даже можете записать {$obj->values[3]->name}";
echo "Это значение переменной по имени $name: {$ {$name}}";
?>
Доступ к символу в строке и его изменение:
Символы в строках можно использовать и модифицировать, определив их смещение относительно начала строки, начиная с нуля, в фигурных скобках после строки. Приведем примеры:
Получение первого символа строки $str = 'Это тест.';
$first = $str{0};
Получение третьего символа строки $third = $str{2};
Получение последнего символа строки
$str = 'Это все еще тест.';
$last = $str{strlen($str)-1};
Изменение последнего символа строки $str = 'Посмотри на море'; $str{strlen($str)-1} = 'я';
?>
Строковые функции и операторы
Строковые операторы
Конкатенация строк:
различных языках программирования используются различные операторы конкатенации (объединения) строк. Например, в Pascal используется оператор "+". Использование в PHP оператора "+" для конкатенации строк некорректно: если строки содержат числа, то вместо объединения строк будет выполнена операция сложения двух чисел.
PHP есть два оператора, выполняющие конкатенацию.
Первый - оператор конкатенации ('.'), который возвращает объединение левого и правого аргумента.
Второй - оператор присвоения с конкатенацией, который присоединяет правый аргумент к левому.
Приведем конкретный пример:
$a = "Hello ";
$b = $a . "World!"; // $b содержит строку "Hello World!
- Это конкатенация
$a = "Hello ";
$a .= "World!"; // $a содержит строку "Hello World!
- Это присвоение с конкатенацией
?>
Операторы сравнения строк
Для сравнения строк не рекоммендуется использовать операторы сравнения == и !=, поскольку они требуют преобразования типов. Пример:
$x=0;
$y=1;
if ($x == "") echo "
x - пустая строка
";
if ($y == "") echo "
y - пустая строка
"; //Выводит:
x - пустая строка
?>
Данный скрипт сообщает нам, что $x - пустая строка. Это связано с тем, что пустая строка ("") трактуется прежде всего как 0, а только затем - как "пусто". В PHP операнды сравниваются, как строки, только в том случае, если оба они - строки. В противном случае они сравниваются как числа. При этом любая строка, которую PHP не удается перевести в число (в том числе и пустая строка), будет восприниматься как 0.
Примеры сравнения строк:
$x="Строка";
$y="Строка";
$z="Строчка";
if ($x == $z) echo "
Строка X равна строке Z
";
if ($x == $y) echo "
Строка X равна строке Y
";
if ($x != $z) echo "
Строка X НЕ равна строке Z
";
Выводит:
Строка X равна строке Y
Строка X НЕ равна строке Z
?>
Чтобы избежать путанницы и преобразования типов, рекоммендуется пользоваться оператором эквивалентности при сравнении строк. Оператор эквивалентности позволяет всегда корректно сравнивать строки, поскольку сравнивает величины и по значению, и по типу:
$x="Строка";
$y="Строка";
$z="Строчка";
if ($x === $z) echo "
Строка X равна строке Z
";!
if ($x === $y) echo "
Строка X равна строке Y
";!
if ($x !== $z) echo "
Строка X НЕ равна строке Z
";!
Выводит:
Строка X равна строке Y
Строка X НЕ равна строке Z
?>
Функции для работы со строками
Для работы со строками в PHP существует множество полезных функций. Кратко разберем часть функций для работы со строками.
Базовые строковые функции
strlen(string $st)
Одна из наиболее полезных функций. Возвращает просто длину строки, т. е., сколько символов содержится в $st. Строка может содержать любые символы, в том числе и с нулевым кодом (что запрещено в Си). Пример:
$x = "Hello!";
echo strlen($x); // Выводит 6
strpos(string $where, string $what, int $fromwhere=0)
Пытается найти в строке $where подстроку (то есть последовательность символов) $what и в случае успеха возвращает позицию (индекс) этой подстроки в строке. Необязательный параметр $fromwhere можно задавать, если поиск нужно вести не с начала строки $ from, а с какой-то другой позиции. В этом случае следует эту позицию передать в $fromwhere. Если подстроку найти не удалось, функция возвращает false. Однако будьте внимательны, проверяя результат вызова strpos() на false — используйте для этого только оператор ===. Пример:
echo strpos("Hello","el"); // Выводит 1
И еще пример:
if (strpos("Norway","rwa") !== false) echo "Строка rwa есть в Norway";
При сравнении используйте операторы тождественных сравнений (===) (!==) чтобы избежать проблем с определением типов
substr(string $str, int $start [,int $length])'
Данная функция тоже востребуется очень часто. Ее назначение — возвращать участок строки $str, начиная с позиции $start и длиной $length. Если $length не задана, то подразумевается подстрока от $start до конца строки $str. Если $start больше, чем длина строки, или же значение $length равно нулю, то возвращается пустая подстрока. Однако эта функция может делать и еще довольно полезные вещи. К примеру, если мы передадим в $start отрицательное число, то будет считаться, что это число является индексом подстроки, но только отсчитываемым от конца $str (например, -1 означает "начиная с последнего символа строки"). Параметр $length, если он задан, тоже может быть отрицательным. В этом случае последним символом возвращенной подстроки будет символ из $str с индексом $length, определяемым от конца строки. Примеры:
$str = "Programmer";
echo substr($str,0,2); // Выводит Pr echo substr($str,-3,3); //
Выводит mer
strcmp(string $str1, string $str2)
Сравнивает две строки посимвольно (точнее, побайтово) и возвращает: 0, если строки полностью совпадают; -1, если строка $str1 лексикографически меньше $str2; и 1, если, наоборот, $str1 "больше" $str2. Так как сравнение идет побайтово, то регистр символов влияет на результаты сравнений.
strcasecmp(string $str1, string $str2)
То же самое, что и strcmp(), только при работе не учитывается регистр букв. Например, с точки зрения этой функции "ab" и "AB" равны.
Функции для работы с блоками текста
Перечисленные ниже функции чаще всего оказываются полезны, если нужно проводить однотипные операции с многострочными блоками текста, заданными в строковых переменных.
str_replace(string $from, string $to, string $str)'
Заменяет в строке $str все вхождения подстроки $from (с учетом регистра) на $to и возвращает результат. Исходная строка, переданная третьим параметром, при этом не меняется. Эта функция работает значительно быстрее, чем ereg_replace(), которая используется при работе с регулярными выражениями PHP, и ее часто используют, если нет необходимости в каких-то экзотических правилах поиска подстроки. Например, вот так мы можем заместить все символы перевода строки на их HTML эквивалент — тэг
:
$st=str_replace("\n","
\n",$str)
Как видим, то, что в строке
\n тоже есть символ перевода строки, никак не влияет на работу функции, т. е. функция производит лишь однократный проход по строке. Для решения описанной задачи также применима функция nl2br(), которая работает чуть быстрее.
string nl2br(string $string)
Заменяет в строке все символы новой строки \n на
\n и возвращает результат. Исходная строка не изменяется. Обратите внимание на то, что символы \r, которые присутствуют в конце строки текстовых файлов Windows, этой функцией никак не учитываются, а потому остаются на старом месте.
WordWrap(string $str, int $width=75, string $break="\n")
Эта функция, появившаяся в PHP4, оказывается невероятно полезной, например, при форматировании текста письма перед автоматической отправкой его адресату при помощи mail(). Она разбивает блок текста $str на несколько строк, завершаемых символами $break, так, чтобы на одной строке было не более $width букв. Разбиение происходит по границе слова, так что текст остается читаемым. Возвращается получившаяся строка с символами перевода строки, заданными в $break. Пример использования:
$str = "Это текст электронного письма, которое нужно буд ет отправить адресату...";
Разбиваем текст по 20 символов
$str = WordWrap ($str, 20, "
");
echo $str;
Выводит: /* Это текст электронного письма, которое нужно будет отправить адресату... */
?>
strip_tags (string $str [, string $allowable_tags])
Еще одна полезная функция для работы со строками. Эта функция удаляет из строки все тэги и возвращает результат. В параметре $allowable_tags можно передать тэги, которые не следует удалять из строки. Они должны перечисляться вплотную друг к другу. Примеры:
$stripped = strip_tags ($str); // Удаляет все html - теги из строки (текста)
$stripped = strip_tags($str, "