Задать вопрос
@ishimskayamahorka14

Как сделать, чтобы функция обрабатывалась рекурсивно?

Как сделать, чтобы функция обрабатывалась рекурсивно для шорткодов любой вложенности?

  1. [random]{Вариант1|Вариант2}[/random]
  2. {Вариант1|[random]Вариант2|Вариант2[/random]}


Сейчас возникает проблема, когда пытаюсь использовать [random][/random] внутри {}

function generateSpinText($template) {

    $processCurlyBraces = function($matches) use (&$processCurlyBraces, &$processRandomBraces) {
        $options = explode('|', $matches[1]);
        // Обработка вложенных скобок
        foreach ($options as &$option) {
            if (preg_match('/\[random/', $option)) {
                $option = preg_replace_callback('/\[random(\d*)\]([^\[]*?)\[\/random\]/s', $processRandomBraces, $option);
            }
            $option = preg_replace_callback('/\{([^{}]+)\}/', $processCurlyBraces, $option);
        }
        return $options[array_rand($options)];
    };

    $processRandomBraces = function($matches) use (&$processCurlyBraces, &$processRandomBraces) {
        $content = $matches[2];
        $options = explode('|', $content);

        // Обработка вложенных скобок
        foreach ($options as &$option) {
            if (preg_match('/\{/', $option)) {
                $option = preg_replace_callback('/\{([^{}]+)\}/', $processCurlyBraces, $option);
            }
            $option = preg_replace_callback('/\[random(\d*)\]([^\[]*?)\[\/random\]/s', $processRandomBraces, $option);
        }

        $count = isset($matches[1]) && $matches[1] !== '' ? intval($matches[1]) : count($options);
        shuffle($options);
        $selectedOptions = array_slice($options, 0, $count);
        return implode('', $selectedOptions);
    };

    // обработка {}
    while (preg_match('/\{([^{}]+)\}/', $template)) {
        $template = preg_replace_callback('/\{([^{}]+)\}/', $processCurlyBraces, $template);
    }

    // обработка [random][/random]
    while (preg_match('/\[random(\d*)\]([^\[]*?)\[\/random\]/s', $template)) {
        $template = preg_replace_callback('/\[random(\d*)\]([^\[]*?)\[\/random\]/s', $processRandomBraces, $template);
    }

    return $template;
}
  • Вопрос задан
  • 131 просмотр
Подписаться 1 Простой 10 комментариев
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽