@damarkuzz

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

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

  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;
}
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы