- Генерация случайной строки в PHP
- 1. Использование random_bytes() функция
- 2. Использование openssl_random_pseudo_bytes() функция
- 3. Использование random_int() функция
- Выводим случайную строку из файла
- Комментарии:
- random_bytes
- Список параметров
- Возвращаемые значения
- Ошибки
- Список изменений
- Примеры
- Смотрите также
- Как в PHP выдернуть рандомно уникальные строки из текстового файла?
Генерация случайной строки в PHP
В этой статье показано, как сгенерировать случайную строку в PHP.
1. Использование random_bytes() функция
В PHP 7 вы можете использовать random_bytes() функция для генерации криптографически безопасных случайных байтов указанной длины. Возвращенные байты могут быть преобразованы в строку, содержащую шестнадцатеричное представление.
Функции CSPRNG random_bytes() а также random_int() были добавлены в PHP в версии 7.0. Эти функции можно использовать в криптографических целях, например для генерации случайных векторов инициализации и солт-значений. Если вы все еще используете PHP 5.x, вот PHP 5 polyfill для этих функций.
2. Использование openssl_random_pseudo_bytes() функция
До PHP 7.0 вы также можете использовать openssl_random_pseudo_bytes() функция для генерации псевдослучайной строки байтов указанной длины. Он использует криптографически стойкий алгоритм для создания псевдослучайных байтов. Начиная с PHP 7.4.0, эта функция выдает исключение в случае сбоя.
3. Использование random_int() функция
Если вы хотите ограничить допустимые символы в случайной строке, вы можете написать собственную процедуру для генерации случайных строк. Наиболее распространенный и эффективный подход — случайный выбор символов из нужного диапазона с помощью random_int() и добавляйте этот символ в строку, пока не будет достигнута нужная длина.
Вот пример того, как вы можете этого добиться. Он генерирует случайную буквенно-цифровую строку ASCII, используя диапазон, состоящий из прописных и строчных букв и цифр. Как уже упоминалось ранее, random_int() Функция была представлена в PHP 7 и использует криптографически безопасный генератор псевдослучайных чисел (CSPRNG).
Выводим случайную строку из файла
Давненько я не писал посты для категории «WordPress», но сегодня я решил восполнить этот пробел. Я расскажу как сделать вывод случайной записи из файла в любое место шаблона на WordPress. Думаю многим пригодится, ведь выводить можно все что угодно: от простых шуток и анекдотов до случайных рецептов, например, для кулинарного сайта. Читаем дальше.
Для начала, если кто не понял о чем пойдет речь, то посмотрите наверх. Видите там оранжевую строчку? Она выводится автоматически из специального файла. Можно, конечно, для этого использовать БД. Просто создать там новую таблицу, но я решил пойти по пути наименьшего сопротивления и использовать обычный txt файл. Вот как это выглядит у меня:
Теперь что нам понадобится:
Обычный текстовый файл (я сразу все кодирую в UTF-8 без BOM, чтобы не было лишних проблем с кодировкой). Он будет содержать нужные нам строки, которые мы хотим выводить в случайном порядке.
Для непосредственно вывода я использовал простой код:
Вставил его в файл header.php своей темы. Все, этого достаточно!
Если подумать где применить такую возможность, то я могу придумать примерно следующее:
- случайные шутки и анекдоты;
- случайные цитаты умных людей;
- случайные строки из песен для сайтах с текстами;
- рецепты для сайтов с рецептами;
- рандомные программы для варезников.
Вообще, можно выводить все что угодно, а если в файле со строками использовать ссылки, то будет дополнительная перелинковка, как в случае с хлебными крошками. Я не стал оформлять все это в виде плагина, так как не очень их люблю и предпочитаю обходиться простым кодом где это возможно.
Вот вроде бы и все, только статья получилась маловата.
О, сегодня дочитал книгу «Голодные игры». За всю свою жизнь я прочитал, наверное, книг 5 😀 Я имею ввиду художественную литературу, а вот технической за годы учебы в университете было проработано достаточное количество. Сестра у меня читать любит, поэтому в комнате всегда много книг лежит. Вот мне как-то раз скучно стало, а под руку подвернулись голодные игры. Вспомнив каким полнейшим УГ оказался фильм я было хотел книгу отложить, но прочитав буквально пару страниц оторваться уже не смог 😉 Это не постовой и не реклама, никаких ссылок нет, я просто делюсь с вами своими наблюдениями и мыслями, как и положено делать на болге.
Вот теперь точно все. Подписывайтесь, комментируйте. И пусть удача всегда будет на вашей стороне 😀
Комментарии:
- Алексей — 01.07.2012 16:42 Сергей, отличный материал! Давно задумывался на одном из своих сайтов выводить случайную цитату. Обязательно сделаю как вы написали! Спасибо за статейку! 😉
- myblaze — 01.07.2012 16:58 Не за что! Все пишут что они рады когда их записи комментируют и хоть это звучит уже как-то заезженно, но я вот реально доволен, когда вижу положительные отзывы 😉
- Алексей — 01.07.2012 17:13 Но вот скажи, Сергей, куда мне еще выразить свое положительное отношение к материалу, как не в комментариях? Прочитать и закрыть страницу — это как-то не интересно. 😉
- ExFedot — 01.07.2012 18:10 Пригодится, нормально! Книгу не читал, но теперь может прочитаю)))
- Лысенко Евгений — 01.07.2012 21:40 То что нужно 😉 Записал это мероприятие в план действий по улучшению блога.
- нерадивый бухгалтер — 01.07.2012 23:19 Возьму на заметку, надо только подумать как это лучше реализовать)
- myblaze — 02.07.2012 08:27 Почитай, мне понравилось.
- myblaze — 02.07.2012 08:27 Отлично 🙂
- myblaze — 02.07.2012 08:28 Если что-то не получится — пишите, помогу чем смогу 😉
- нерадивый бухгалтер — 04.07.2012 23:12 Ой спасибо, я ведь полный кипятильник в этом деле)
- Евгений Комиссаров — 07.07.2012 13:23 да для перелинковки то что нужно:) А можно как то сделать что бы еще и миниатюры возле текста выводились ?
- Евгений Комиссаров — 07.07.2012 17:25 Разобрался.. просто ввожу в одну строку все что мне нужно и оно работает 🙂
- myblaze — 07.07.2012 20:19 Да, там можно все что угодно писать 🙂 А то что сами разобрались тоже очень хорошо)
- Denis — 17.07.2012 19:09 А я вот например хочу вывести название записи. А для этого надо написать php-код в txt-файле , верно? Я пишу, но на странице так код и выводится «». Не знаете, как решить эту проблему?
- myblaze — 17.07.2012 19:27 Если я правильно понял суть проблемы, то не забудьте расширением у файла с php кодом изменить с .txt на .php.
- Denis — 17.07.2012 19:32 Уже пробовал, не помогло.
- myblaze — 17.07.2012 20:21 Я суть вопроса не понял если честно. Вы сделали все по инструкции?
- Denis — 17.07.2012 20:24 Да, один в один.
- myblaze — 17.07.2012 21:56 Блин чет я туплю. В общем так. Файл с фразами, которые будем выводить — расширение txt. Все, больше файлов не нужно. Теперь код, который эти фразы выводит — приведен в статье. Его вставляем, например в файл sidebar.php, если у вас вордпресс. Если у вас не wordpress, а какая-то другая CMS — все равно должно работать. Если у вас просто выводится текстом код, как пишете, то проверьте, у вас хостинг поддерживает php?
- Denis — 17.07.2012 21:59 У меня просто выводится текстом код. CMS WordPress. PHP поддерживается.
- myblaze — 17.07.2012 22:29 Ок, куда вставляете код? В общем пишите на мыло — так проще будет =) Мыло на странице «Пишите мне».
- Denis — 17.07.2012 22:33 В файл single.php
- vvnis — 18.07.2012 09:06 можно лайки ставить! нужны лайки!
- Андрей — 16.10.2014 15:24 А вы можете сделать такой скрипт, для хостингов без поддержки php как например ucoz?
- Дмитрий — 24.04.2015 14:49 лайк
- Akira Tsukizawa — 24.05.2015 20:04 Полезная штука. Спасибо!
- сергей — 04.06.2018 14:53 привет! а как это сделать по клику? чтоб на кнопу нажал и новая строка но без перезагрузки страницы?
random_bytes
Создаёт строку, содержащую равномерно выбранные случайные байты с запрошенной длиной.
Поскольку возвращаемые байты выбираются совершенно случайно, полученная строка может содержать непечатаемые символы или недопустимые последовательности UTF-8. Может потребоваться её кодирование перед передачей или отображением.
Случайная последовательность, создаваемая функцией, подходит для всех приложений, включая генерацию долгосрочных секретов, таких как ключи шифрования.
Источники случайных величин в порядке приоритета:
- Linux: » getrandom(), /dev/urandom
- FreeBSD >= 12 (PHP >= 7.3): » getrandom(), /dev/urandom
- Windows (PHP >= 7.2): » CNG-API Windows: » CryptGenRandom
- macOS (PHP >= 8.2; >= 8.1.9; >= 8.0.22, если CCRandomGenerateBytes доступен во время компиляции): CCRandomGenerateBytes() macOS (PHP >= 8.1; >= 8.0.2): arc4random_buf(), /dev/urandom
- NetBSD >= 7 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom
- OpenBSD >= 5.5 (PHP >= 7.1; >= 7.0.1): arc4random_buf(), /dev/urandom
- DragonflyBSD (PHP >= 8.1): » getrandom(), /dev/urandom
- Solaris (PHP >= 8.1): » getrandom(), /dev/urandom
- Любая комбинация операционной системы и версии PHP, не указанная ранее: /dev/urandom
- Если ни один из источников не доступен или все они не генерируют случайную величину, то будет выброшено исключение Random\RandomException .
Замечание: Эта функция была добавлена в PHP 7.0, а для версий с 5.2 по 5.6 включительно доступна » пользовательская реализация.
Список параметров
Длина генерируемой строки в байтах; должно быть 1 или больше.
Возвращаемые значения
Возвращает строку, состоящую из заданного количества криптографически безопасных байт.
Ошибки
- Если подходящие источники случайных величин отсутствуют, то выбрасывается исключение Random\RandomException .
- Если значение параметра length меньше 1 , будет выброшена ошибка ValueError .
Список изменений
Версия | Описание |
---|---|
8.2.0 | В случае возникновения ошибки CSPRNG , функция теперь будет выбрасывать исключение Random\RandomException . Ранее выбрасывалось исключение Exception . |
Примеры
Пример #1 Пример использования random_bytes()
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
- Random\Randomizer::getBytes() — Получает случайные байты
- random_int() — Получает криптографически безопасное, равномерно выбранное целое число
- bin2hex() — Преобразует бинарные данные в шестнадцатеричное представление
- base64_encode() — Кодирует данные в формат MIME base64
Как в PHP выдернуть рандомно уникальные строки из текстового файла?
Имеем текстовой фал с N-м количеством строк текста (строки необязательно должны быть предложениями, и необязательно со знаками препинания).
Допустим нужно выдернуть из этого файла 150 случайных строк и вывести их.
На одном из форумов увидел вот такой код (который вроде как должен как раз реализовать такую идею, однако, я попробовал — и каждый раз скрипт выводит одну-две строки текста (номер строки : текст), а остальные строки только номера строк без текста. ). Помогите найти ошибку. Заранее спасибо.
——-
КОД:
# Подсчитываем кол-во строк в файле.
$f = fopen(‘semantic.txt’, «r»);
# Подсчитываем кол-во строк в файле.
function FileGetCount( $path ) if ( $f = fopen( $path , «r» ) ) $counter = 0;
while (fgets($f)) < $counter++; >
fclose($f);
return $counter;
>
return false;
>
function GetRandomArray( $num , $lineCount ) if ( $num > $lineCount ) $num = $lineCount;
>
$subFunction = function( &$result , &$num , $min , $max ) use(&$subFunction) if ( ( $num $max ) ) return [];
>
$key = mt_rand( $min , $max );
$result[] = $key;
$num—;
if ( mt_rand(0,1) ) $subFunction( $result , $num , $min , $key-1 );
$subFunction( $result , $num , $key+1 , $max );
> else $subFunction( $result , $num , $key+1 , $max );
$subFunction( $result , $num , $min , $key-1 );
>
>;
$result = [];
$subFunction( $result , $num , 0 , $lineCount — 1 );
return $result;
>
function EchoRandomLine( $path , $randomMap ) if ( $f = fopen( $path , «r» ) ) $last = 0;
foreach($randomMap as $line) rewind($f);
$newLine = $line = $line+1;
while($newLine—) $buffer = fgets($f);
>
echo «$line : $buffer
«; # номер_строки : сама_строка
>
fclose($f);
return true;
>
return false;
>
$path = «semantic.txt»;
$countRandomLine = 150;
$countLine = FileGetCount( $path );
$randomMap = GetRandomArray( $countRandomLine , $countLine );
EchoRandomLine( $path , $randomMap );
?>
Простой 1 комментарий