Это, конечно не особо относится с Битрикс. Но мне тут понадобилось сделать рандомизатор текста, для создания объявлений для Авито (он же "Спинтакс").
Этот код представляет функцию 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;
}
Если что-то непонятно, появились вопросы или нашли ошибки, пишите в комментариях. Постараюсь ответить быстро.