В начале главы говорилось о том, как соединять строки с помощью оператора
сцепления. Но из длинных строк можно также извлекать маленькие части. Рас
смотрим две функции, с помощью которых можно делать это. Необходимо от
метить, что для эффективного извлечения частей строки нужно иметь какую
то информацию о самой строке.
Функция strtok ( ) извлекает подстроку, называемую лексемой, из строки на
основе заранее установленного разделителя (обычно запятая или пробел). На
пример, если пользователи вводят имя и фамилию в одном поле, разделяя эти
данные пробелом, то можно узнать имя с помощью следующего кода:
$FirstName = strtok($Name, " " ) ;
Здесь $Name это имя переменной, получаемой из формы с полным именем
пользователя. Строка дает команду РНР извлечь из переменной $Name все до
первого пробела. Если пользователи вводят полное имя в формате «фамилия,
имя», фамилию можно узнать следующим образом:
$LastName = strtok($Name, " , " ) ;
К счастью, нам не нужно ломать над этими вариантами голову, так как в фор
ме для ввода имени и фамилии мы предусмотрительно использовали разные
поля.
Второй способ выделения подстрок обратиться к индексной, позиции символов
внутри строки. Индексация строки означает нумерацию символов с начала стро
ки, как если бы строка была массивом, а символы ее элементами. В РНР, как
и в большинстве языков программирования, индексация начинается с нуля.
Поэтому пронумерованная строка “Larry” будет выглядеть следующим образом:
L на позиции 0, а 1, г 2, вторая г 3, у 4. Хотя длина строки ” Larry” равна пяти,
ее индекс «пробегает» значения от 0 до 4. Разобравшись с индексами, мы можем
использовать функцию substr ( ) для выделения нужного диапазона символов:
$SubString = substr(SString,0,10);
Вопервых, необходимо указать строку (здесь это $String), из которой бу
дет вырезаться подстрока. Вовторых, с помощью индекса необходимо указать
начало подстроки (если вы начинаете индексацию с нуля, значит, учитываться
будет и первый символ). Третьим параметром вы указываете, из скольких сим
волов будет состоять подстрока (10). Если строка состоит из меньшего количе
ства символов, чем 10, подстрока закончится в конце строки.
Часто для определения длины строки используют функцию s t r l e n f ) . Она
рассчитывает длину строки, то есть количество содержащихся в ней символов:
$StringLength = strlen(SString);
Еще раз напомню, что нумерация символов в строке начинается с нуля, так
что индекс последнего символа в строке всегда равен $StringLengthl!
Давайте используем рассмотренные функции substr ( ) , strlen ( ) и md5 ( )
для создания простой программы генерации паролей. Известно, что, чем бо
лее случайно сочетание символов в пароле, тем он надежнее. Самые надежные
пароли не имеют никаких ассоциаций, не встречаются даже в самых подроб
ных словарях. Лучше всего, если пароль состоит из беспорядочного сочетания
букв и цифр в разном регистре. Этот сценарий будет создавать новый случай
ный пароль каждый раз, когда вы перезагружаете страницу.
Создание генератора паролей в РНР
- Начните создавать новый PHPдокумент в текстовом редакторе со следу
ющих строк: - Закончите сценарий следующим кодом:
- Сохраните сценарий как passwords.php (листинг 5.7), загрузите его на сер
вер и протестируйте в браузере (рис.).
<HTMLxHEADxTITLE>Password Generator</TITLEx/HEADxBODYx?php
$String = "This is the text which will be encrypted so that we may
—create random and move secure passwords!";
Здесь можно вставить любую строку. Конкретный текст не имеет значения
для наших целей. Этот текст будет зашифрован для создания случайной стро
ки, из которой взят пароль.
$Length = 8;
Установив длину пароля в виде переменной, легко менять одно это значе
ние для получения паролей различной длины. Длина пароля ограничена 32 зна
ками, то есть длиной строки, зашифрованной с помощью функции md5 ( ) .
SString = md5(SString);
Функция md5 ( ) похожа на crypt ( ) , но генерирует строки длиной до 32 сим
волов. Более подробную информацию по функции md5 ( ) можно найти в ру
ководстве по РНР или на сайте, посвященном этому языку.
$StringLength = strlen($String);
Чтобы извлечь подстроку, необходимо знать длину зашифрованной строки.
Для этого мы используем функцию strlen ( ) , которая определяет количество
символов в строке. Хотя точно известно, что при использовании md5 ( ) строка
всегда будет состоять из 32 символов, лучше перестраховаться и применить
функцию strlen ( ) . В этом случае, даже если позже вы измените функцию (на
пример, используете encrypt ( ) вместо md5 ( ) ) , данная строка кода будет рабо
тать корректно.
srand ((double) microtimeO * 1000000);
$Begin = rand(0,($StringLength$Lengthl));
Необходимо определить исходную позицию для функции s u b s t r f ) . Функ
‘ция rand ( ) создает случайное число между минимумом (здесь это 0) и максиму
мом. Не забывайте перед этим использовать функцию srand ( ) , иначе не по
лучите действительно случайных результатов от rand ( ) . Мы установили максимум
как длину строки минус длина пароля минус единица. И вот почему: если за
шифрованная строка состоит из 32 символов, а пароль из восьми, то мы мо
жем использовать функцию substr() и получить пароль из восьми символов
максимум с 24й позиции, или, учитывая нумерацию начиная с 0, с индекса
номер 23. Мы взяли вычисление максимальной начальной позиции в скобки
только для ясности, в функции rand () они не требуются.
Последний шаг «заставить» функцию substr ( ) извлечь подстроку нужной
длины, начиная с вычисленной позиции.
$Password = substr($String, $Begin, $Length);
Вы прописываете, что переменная $Password равна подстроке, которая по
лучена из переменной $string, начинающейся с индексной позиции $Begin
и продолжающейся $Length символов.
print ("Your recommended password is:<P><BIG>$Password</BIG>n");
А теперь уверенно распечатайте результат.
?></BODYx/HTML>
Листинг 5.7 v Сценарий passwords.php содержит в сжатой форме то, чему
вы научились до этого момента. И всего на 16 строках!
1 <HTML>
2 <HEAD>
3 <TITLE>Password Generator</TITLEx/HEAD>
4 <BODY>
5 <?php
6 $String = "This is the text which will be encrypted so that we may
create random and secure passwords!";
7 $Length = 8 ; // Измените это значение, чтобы установить длину пароля.
32 символа максимум.
8 $String = md5($String);
9 $StringLength = strlen($String);
10 srand ((double) microtimeO * 1000000);
11 $Begin = rand(0,($StringLength$Lengthl)); // Получить произвольную
стартовую точку.
12 $Password = substr($String, $Begin, $Length);
13 print ("Your recommended password is:<PxBIG>$Password</BIG>n");
14 ?>
15 </BODY>
16 </HTML>
Вместо установки переменной $Length можно использовать метод GET для от
правки в страницу значения длины строки, добавив ?Length=8 к URL (если вы хо
тите это попробовать, удалите седьмую строку).
Базы данных имеют следующий или подобный формат даты: YYYYMMDD. Так как
известен точный формат извлекаемой из базы данных строки, то значения года,
месяца и дня могут быть легко рассчитаны с помощью функции substr ():
$Year = substr($Date,0,4);
$Month = substr($Date,5,2);
$Day = substr($Date,8,2);
Будьте внимательны при использовании функции strlen(). Например, нельзя
писать $ password = strlen ($Password);, так как в этом случае реальное зна
чение пароля будет потеряно и заменено числом, указывающим на количество
символов, которое раньше имелось в переменной $ Pas sword.