Отменить текст в php из текста с текстом на уровне предложения

Мне нужно аккуратно выводить текст с текстом на php-страницу. У меня уже есть текст prespun в формате {hi | hello | greetings}. У меня есть php-код, который я нашел в другом месте, но он не выводит текст с текстом на уровне предложения, где два {{приходят. Вот код, который нуждается в исправлении.

<?php function spinText($text){ $test = preg_match_all("#\{(.*?)\}#", $text, $out); if (!$test) return $text; $toFind = Array(); $toReplace = Array(); foreach($out[0] AS $id => $match){ $choices = explode("|", $out[1][$id]); $toFind[]=$match; $toReplace[]=trim($choices[rand(0, count($choices)-1)]); } return str_replace($toFind, $toReplace, $text); } echo spinText("{Hello|Hi|Greetings}!");; ?> 

Результат будет случайным образом выбранным: Hello OR Привет или Привет.

Однако, если есть уровень предложения, вращающийся, выход испорчен. Например:

 {{hello|hi}.{how're|how are} you|{How's|How is} it going} 

Выход

 {hello.how're you|How is it going} 

Как вы можете видеть, текст полностью не вращается.

спасибо

Это рекурсивная проблема, поэтому регулярные выражения не так велики; но рекурсивные шаблоны могут помочь:

 function bla($s) { // first off, find the curly brace patterns (those that are properly balanced) if (preg_match_all('#\{(((?>[^{}]+)|(?R))*)\}#', $s, $matches, PREG_OFFSET_CAPTURE)) { // go through the string in reverse order and replace the sections for ($i = count($matches[0]) - 1; $i >= 0; --$i) { // we recurse into this function here $s = substr_replace($s, bla($matches[1][$i][0]), $matches[0][$i][1], strlen($matches[0][$i][0])); } } // once we're done, it should be safe to split on the pipe character $choices = explode('|', $s); return $choices[array_rand($choices)]; } echo bla("{{hello|hi}.{how're|how are} you|{How's|How is} it going}"), "\n"; 

См. Также: Рекурсивные узоры