Как стать автором
Поиск
Написать публикацию
Обновить

Случайные варианты текста на 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 и заменяет слова в скобках на один из вариантов находящихся в ней.

Где это можно применить? Допустим, чтобы разнообразить приветствие на сайте, вы пишите не просто «Привет», а несколько вариантов: «{Привет|Добро пожаловать {к нам|на наш сайт|в наш дом}}» и так далее. Тогда, каждый раз пользователь будет видеть разное приветствие. Конечно, использовать эту функцию можно с любой другой целью, но будьте внимательны — смысл предложения не должен поменяться. Следите за тем, что слова правильно связанны и что в любом из вариантов будут иметь правильный смысл. Пользуйтесь :)
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.