Поиск

Извлечение части строки

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

Функция 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 ( ) для создания простой программы генерации паролей. Известно, что, чем бо лее случайно сочетание символов в пароле, тем он надежнее. Самые надежные пароли не имеют никаких ассоциаций, не встречаются даже в самых подроб ных словарях. Лучше всего, если пароль состоит из беспорядочного сочетания букв и цифр в разном регистре. Этот сценарий будет создавать новый случай ный пароль каждый раз, когда вы перезагружаете страницу.

Создание генератора паролей в РНР

  1. Начните создавать новый PHPдокумент в текстовом редакторе со следу ющих строк:
  2. <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");

    А теперь уверенно распечатайте результат.

  3. Закончите сценарий следующим кодом:
  4. ?></BODYx/HTML>
  5. Сохраните сценарий как passwords.php (листинг 5.7), загрузите его на сер вер и протестируйте в браузере (рис.).
  6. Листинг 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.