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

Ссылка скопирована
1 ответ

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

  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; }

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; }

Дополнительно:

Вы бы лучше написали чего хотите добиться. Регулярки и реплэйсы и так рекурсивно работают

  • Дмитрий, сейчас при попытке обработать функцией:

    Ввод:
    {Вариант1|[random]Вариант2|Вариант2[/random]}

    Вывод (несколько итераций):

    1. [random]Вариант2
    2. Вариант2[/random]
    3. Вариант1

    Ломается структура, когда [random][/random] внутри {}

  • Дмитрий, должно быть

    Вывод (несколько итераций):

    1. Вариант1
    2. Вариант2Вариант2
  • damarkuzz, тут слишком много лишнего кода. Вы так и не написали чего хотите добиться? Типо своих ббкодов?
    У вас ищет рандом с цифрой
  • Дмитрий, не совсем, это рандомизация контента (генерация)
  • Дмитрий, так называемые, спин-тексты
  • damarkuzz, https://regex101.com/
    Для отладки регулярок
  • Дмитрий, например,
    1. {Привет|Здравствуй} вывдет либо Привет, либо здравствуй
    2. [random]Привет|Здравствуй[/random] выведет оба слова, но в разном порядке

    И вот когда я вкладываю {Привет|random]Привет|Здравствуй[/random]}, то начинаются проблемы

  • В любом случае подобные задачи решаются конечным автоматом, а на нагромождением регулярок.
  • damarkuzz,
    $text = '{Привет|[Привет|Здравствуй|Хай|Здаров]|Не привет|[Один|Два]}';  preg_match_all('#[(.*)]#isU', $text, $matches);  $words = [];  foreach ($matches[1] as $val) { 	$str = explode('|', $val); 	$words[] = $str[array_rand($str)]; }  $text = str_replace($matches[0], $words, $text);  preg_match('#{(.*)}#isU', $text, $matches); $words1 = explode('|', $matches[1]); shuffle($words1); echo implode('|', $words1);

    $text = '{Привет|[Привет|Здравствуй|Хай|Здаров]|Не привет|[Один|Два]}'; preg_match_all('#[(.*)]#isU', $text, $matches); $words = []; foreach ($matches[1] as $val) { $str = explode('|', $val); $words[] = $str[array_rand($str)]; } $text = str_replace($matches[0], $words, $text); preg_match('#{(.*)}#isU', $text, $matches); $words1 = explode('|', $matches[1]); shuffle($words1); echo implode('|', $words1);

    сократил рандом до квадратной скобки

  • Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Кирилл JS Ответ

    Для того чтобы функция обрабатывалась рекурсивно, необходимо внутри самой функции вызывать её же. Рекурсия - это процесс, при котором функция вызывает саму себя, пока не будет достигнуто определенное условие выхода.

    Пример использования рекурсии на языке PHP:

    function recursiveFunction($number) {
        if ($number <= 0) {
            return;
        }
     
        echo $number;
        recursiveFunction($number - 1);
    }
     
    recursiveFunction(5);

    function recursiveFunction($number) { if ($number <= 0) { return; } echo $number; recursiveFunction($number - 1); } recursiveFunction(5);

    В данном примере функция `recursiveFunction` будет вызывать саму себя с уменьшающимся аргументом `$number` до тех пор, пока `$number` не станет меньше или равным нулю. Когда условие `$number <= 0` будет выполнено, рекурсия завершится.

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

    Надеюсь, данное объяснение поможет вам понять, как сделать функцию обрабатывающейся рекурсивно. Если у вас возникнут дополнительные вопросы или потребуется помощь с конкретным примером, не стесняйтесь обращаться за помощью.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно