Search
Write a publication
Pull to refresh

Случайные варианты текста на php

Сегодня я хочу рассказать о крутой функции, которую я сделал для тестового задания в одну компанию. Задача была следующей:
Сделать на PHP программу, которая бы для строки вида
$str = "{Пожалуйста|Просто} сделайте так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз}.";
выдавала все возможные варианты (вложенность скобок не ограничена) за один запуск.

Для начала, напишем функцию, которая будет искать последнее вхождение символа в строку. Для этого перебираем каждый символ в ней, ищем совпадение и возвращаем позицию символа в строке:
function StrCharPosBack($haystack, $needle) {// ищет последнее вхождение символа
    for ($i = strlen($haystack) ; $i>=0 ; $i--){
        if (substr($haystack, $i, 1) === $needle)
            return $i;
    }
    return false;
}


Далее вводим саму строку:
$str = '{Пожалуйста,|Просто} {постарайтесь сделать|сделайте} так, чтобы это {удивительное|крутое|простое} тестовое предложение {изменялось {быстро|мгновенно} случайным образом|менялось каждый раз|постоянно {изменялось|менялось} при {каждом {новом|повторном {и {невероятном|удивительном|очень {симпатичном|необычном}}}}} обновлении страницы}';

Я ее немного усложнил, добавив больше вложенности.

Ну а теперь напишем сам вывод.
while (strpos($str, "{") !== false){
    $pos1 = strpos($str, "}");
    $buf_mas = substr($str, 0, $pos1);
    $pos2 = StrCharPosBack ($buf_mas, "{");
    $buf_mas = substr($buf_mas, $pos2+1);
    $exploded_buf_mas = explode ("|", $buf_mas);
    $rnd = rand(0, count($exploded_buf_mas)-1);
    $str = substr_replace($str, $exploded_buf_mas[$rnd], $pos2, $pos1+1-$pos2);
}

echo $str;

Этот код проходит по всей строке $str и заменяет слова в скобках на один из вариантов находящихся в ней.

Где это можно применить? Допустим, чтобы разнообразить приветствие на сайте, вы пишите не просто «Привет», а несколько вариантов: «{Привет|Добро пожаловать {к нам|на наш сайт|в наш дом}}» и так далее. Тогда, каждый раз пользователь будет видеть разное приветствие. Конечно, использовать эту функцию можно с любой другой целью, но будьте внимательны — смысл предложения не должен поменяться. Следите за тем, что слова правильно связанны и что в любом из вариантов будут иметь правильный смысл. Пользуйтесь :)
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.