Генерация случайной строки на php.


При написании очередного веб-приложения появилась задача: сгенерировать случайную строку на php. При этом должны быть использованы не только символы, но и числа. Как известно, практически любая задача, которая возникает перед нами, уже имеет решение. Вот и я не стал тратить время на изобретение велосипеда, а просто пошерстил по интернету и нашел нужный скрипт.

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

Функция принимает два параметра: длину нужной строки ($length) и второй параметр в виде строки разделенных запятой (без пробелов) значений (lower, upper, numbers, special). Поясню последний параметр:

lower — символы в нижнем регистре
upper — символы в верхнем регистре
numbers — числа
special — специальные символы

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

1
2
3
$length = 8;
$chartypes = "lower,numbers";
$string = random_string($length, $chartypes);

Если же строка может содержать все возможные варианты (числа, символы в нижнем и верхнем регистре, спецсимволы), то в $chartypes передайте значение «all»:

1
2
3
$length = 8;
$chartypes = "all";
$string = random_string($length, $chartypes);

А вот и сама функция. Обратите внимание, что в своем файле вы должны включить код функции до ее вызова.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function random_string($length, $chartypes) 
{
    $chartypes_array=explode(",", $chartypes);
    // задаем строки символов. 
    //Здесь вы можете редактировать наборы символов при необходимости
    $lower = 'abcdefghijklmnopqrstuvwxyz'; // lowercase
    $upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // uppercase
    $numbers = '1234567890'; // numbers
    $special = '^@*+-+%()!?'; //special characters
    $chars = "";
    // определяем на основе полученных параметров, 
    //из чего будет сгенерирована наша строка.
    if (in_array('all', $chartypes_array)) {
        $chars = $lower . $upper. $numbers . $special;
    } else {
        if(in_array('lower', $chartypes_array))
            $chars = $lower;
        if(in_array('upper', $chartypes_array))
            $chars .= $upper;
        if(in_array('numbers', $chartypes_array))
            $chars .= $numbers;
        if(in_array('special', $chartypes_array))
            $chars .= $special;
    }
    // длина строки с символами
    $chars_length = strlen($chars) - 1;
    // создаем нашу строку,
    //извлекаем из строки $chars символ со случайным 
    //номером от 0 до длины самой строки
    $string = $chars{rand(0, $chars_length)};
    // генерируем нашу строку
    for ($i = 1; $i < $length; $i = strlen($string)) {
        // выбираем случайный элемент из строки с допустимыми символами
        $random = $chars{rand(0, $chars_length)};
        // убеждаемся в том, что два символа не будут идти подряд
        if ($random != $string{$i - 1}) $string .= $random;
    }
    // возвращаем результат
    return $string;
}




Другие посты

Категория: PHP-скрипты

Комментарии (1)

 

  1. Алексей:

    Ну вот, к примеру, функция чуть короче представленной на сайте — делает ровно то же самое, но обращаться к ней проще: 1-м параметром передаём число символов в итоговой строке, а вторым — массив из ключевых строк: ‘low’, ‘upp’, ‘num’, ‘spec’ — в любом наборе и в любом порядке (при отсутствии 2-го параметра строка будет генериться из символов всех типов). Тип очередного символа также определяется случайно. Несовпадение двух соседних не отслеживается — зачем?

    function rand_string($nChars, array $case = array()) {

    define («LOW», ‘abcdefghijklmnopqrstuvwxyz’);
    define («UPP», ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’);
    define («NUM», ‘1234567890’);
    define («SPEC», ‘^@*+-+%()!?’);

    $nChars—;
    $symbols = array();
    if (in_array(‘low’, $case))
    $symbols[] = LOW;
    if (in_array(‘upp’, $case))
    $symbols[] = UPP;
    if (in_array(‘num’, $case))
    $symbols[] = NUM;
    if (in_array(‘spec’, $case))
    $symbols[] = SPEC;
    if (count($symbols) == 0)
    $symbols = array(LOW, UPP, NUM, SPEC);

    $rand_str = »;
    for ($i = 0; $i <= $nChars; $i++) { // циклим по числу необходимых символов в итоговой строке
    $id = mt_rand(0, count($symbols) — 1); // случайным образом определяем ТИП символов, из которых будем получать случайный СИМВОЛ
    $source_str = $symbols[$id];
    $rand_str .= $source_str{ mt_rand(0, strlen($source_str) — 1) }; // очередной случаный символ
    }
    return $rand_str;
    }

Оставить комментарий