Поиск
Извлечение части строки
В начале главы говорилось о том, как соединять строки с помощью оператора сцепления. Но из длинных строк можно также извлекать маленькие части. Рас смотрим две функции, с помощью которых можно делать это. Необходимо от метить, что для эффективного извлечения частей строки нужно иметь какую то информацию о самой строке.
Функция 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);