mail@vecdev.ru

Рандомизатор текста на PHP и JS

Это, конечно не особо относится с Битрикс. Но мне тут понадобилось сделать рандомизатор текста, для создания объявлений для Авито (он же "Спинтакс").

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

  • Маска {фраза|фраза|фраза|и т.д.}: служит для выбора случайного значения из синонимов слова или словосочетания.
  • Маска [фраза&фраза&фраза&и т.д.]: служит для выбора ВСЕХ значений перечисления в случайном порядке. Чтобы исключить знак препинания в конце последнего элемента мы удаляем ";" и ",".

Обе маски поддерживают бесконечное количество вложений, что позволяет строить сложные конструкции {{}[{{}}]} и т.д.

Благодаря такому подходу можно строить по настоящему уникальные тексты (главное со скобками не намахаться.

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


function selectRandomOption($text) {
    // Удаление символов переноса строки
    $text = preg_replace('/\r\n|\r|\n|\t/', '', $text);
    // Обработка масок {}
    while (preg_match('/\{([^\{\}]*)\}/', $text, $match)) {
        $options = explode('|', trim($match[1]));
        $randomOption = $options[array_rand($options)]; // Выбор случайного элемента из списка
        $text = str_replace($match[0], $randomOption, $text); // Замена маски на случайный элемент
    }
    // Обработка масок [] - выбор всех вариантов в случайном порядке, используя & в качестве разделителя
    while (preg_match('/\[(.*?)\]/', $text, $match)) {
        $items = explode('&', trim($match[1])); // Разделение элементов внутри маски по знаку &
        shuffle($items); // Перемешивание элементов для случайного порядка
        $replacedText = implode(' ', $items); // Объединение элементов в случайном порядке с пробелами
        $replacedText = preg_replace('/[;,] $/', '', $replacedText); // Удаление знака препинания на конце последнего элемента
        $text = str_replace($match[0], $replacedText, $text); // Замена маски на все элементы в случайном порядке
    }
    // Дополнительная обработка для удаления лишних пробелов, которые могли появиться
    $text = preg_replace('/\s+/', ' ', $text); // Удаление лишних пробелов
    $text = str_replace('amp;', '', $text); // Удаление &
    $text = str_replace(" ,", ",", $text); // Удаление пробела перед запятой
    $text = trim($text); // Удаление пробелов в начале и в конце строки
    return $text; // Возврат обработанного текста
}

$a = selectRandomOption("{привет|здорова|куку} мир и [солнце, &море, &облака]"); //простой пример
echo $a;

Дополнительно удаляются лишние пробелы, удаляется amp; (бывает выскакивает из-за знака &), удаляется пробел перед запятой в тексте, пробелы в начале и в конце строки.

Бонусом тоже самое на JS:


function selectRandomOption(text) {
        text = text.replace(/\r\n|\r|\n|\t/g, '');

        // Обработка масок {}
        let match = text.match(/\{([^\{\}]*)\}/);
        while (match) {
            const options = match[1].split('|').map(option => option.trim());
            const randomOption = options[Math.floor(Math.random() * options.length)];
            text = text.replace(match[0], randomOption);
            match = text.match(/\{([^\{\}]*)\}/);
        }

        // Обработка масок []
        match = text.match(/\[(.*?)\]/);
        while (match) {
            let items = match[1].split('&').map(item => item.trim());
            // Перемешивание элементов
            for (let i = items.length - 1; i > 0; i--) {
                const j = Math.floor(Math.random() * (i + 1));
                [items[i], items[j]] = [items[j], items[i]];
            }
            let replacedText = items.join(' ').replace(/[,;]$/, '');
            text = text.replace(match[0], replacedText);
            match = text.match(/\[(.*?)\]/);
        }

        text = text.replace(/\s+/g, ' ').trim();
        text = text.replace(/amp;/g, '');
        return text;
    }

Если что-то непонятно, появились вопросы или нашли ошибки, пишите в комментариях. Постараюсь ответить быстро.

Частный разработчик сайтов Vector Dev
Комментарии