Это в браузере, в исходном коде с переносами.
Если надо чтоб в браузере было с переносами замените последнюю строчку на
echo implode("<br><br>", $choices);
Скоро родится новый опен-соурс продукт :) . А пока очередная версия
<?php define("CHOICE_COUNT", 10); define("MAX_REST_COUNT", 5); function callback($matches) { $v = preg_split("/(?<!\|)\|(?!\|)/", $matches[1]); return str_replace("||", "|", (count($v) == 1 ? "{" . $v[0] . "}" : $v[array_rand($v)])); } $str = "Это {простой|не сложный} но {сильный|нужный} {сервис|интернет сервис|утиль|веб-сустем}, который {несомненно|определённо|стопудово|полюбому} будет полезен {веб|web}-мастерам и {SE оптимизаторам|труженикам в сфере оптимизации веб для поисковых систем}. {Сервис|Интернет сервис} помогает {избавить себя от|избежать} пустой траты времени, и высвободить {это|освободившееся} время для {куража с девками|поездки в Венецию|трёхмесячного отдыха на Сейшельских островах|полёта в качестве космического туриста на околоземную орбиту}."; $choices = array(); $rest = 0; while (count($choices) < CHOICE_COUNT) { $begin_count = count($choices); $choices[] = preg_replace_callback("/\{([^{}]*?)\}/", "callback", $str); $choices = array_unique($choices); if (count($choices) > $begin_count) $rest = 0; else $rest++; if ($rest >= MAX_REST_COUNT) break; } echo implode("\n\n", $choices); ?>
И небольшие пояснялки:
CHOICE_COUNT - нужное количество вариантов
MAX_REST_COUNT - защита от зацикливания, если это количество раз содержимое массива с результатами менятся не будет, то вылетаем из цикла.
На выходе получим список вариантов, разделенных пустой строкой.
Тогда лучше сразу обрабатывать только "правильные" конструкции, т.е. фигурные скобки, внутри которых нет других фигурных скобок и есть вертикальная черта. Причем вертикальная черта в свою очередь тоже может экранироваться двойным начертанием ||.
<?php function callback($matches) { $v = preg_split("/(?<!\|)\|(?!\|)/", $matches[1]); return str_replace("||", "|", (count($v) == 1 ? "{" . $v[0] . "}" : $v[array_rand($v)])); } $str = "Это {простой|не сложный} но {сильный|нужный} {сервис|интернет сервис|утиль|веб-сустем}, который {несомненно|определённо|стопудово|полюбому} будет полезен {веб|web}-мастерам и {SE оптимизаторам|труженикам в сфере оптимизации веб для поисковых систем}. {Сервис|Интернет сервис} помогает {избавить себя от|избежать} пустой траты времени, и высвободить {это|освободившееся} время для {куража с девками|поездки в Венецию|трёхмесячного отдыха на Сейшельских островах|полёта в качестве космического туриста на околоземную орбиту}."; echo preg_replace_callback("/\{([^{}]*?)\}/", "callback", $str); ?>
А я думал я один такой :)
pro-maker,
<?php function callback($matches) { $v = explode("|", $matches[1]); return $v[array_rand($v)]; } $str = "Это {простой|не сложный} но {сильный|нужный} {сервис|интернет сервис|утиль|веб-сустем}, который {несомненно|определённо|стопудово|полюбому} будет полезен {веб|web}-мастерам и {SE оптимизаторам|труженикам в сфере оптимизации веб для поисковых систем}. {Сервис|Интернет сервис} помогает {избавить себя от|избежать} пустой траты времени, и высвободить {это|освободившееся} время для {куража с девками|поездки в Венецию|трёхмесячного отдыха на Сейшельских островах|полёта в качестве космического туриста на околоземную орбиту}."; echo preg_replace_callback("/\{(.*?)\}/", "callback", $str); ?>
Решение не верное, а ответ почти верный 😆 . Надо перемножить количество вариантов в каждом блоке, т.е. в вашем примере будет 10240 вариантов.
http://www.gregsadetsky.com/aol-data/
Зачем людей в заблуждение вводите. Точка - метасимвол, означающий любой символ кроме \r и \n. В квадратных скобках точка становится просто символом, т.е. [.]* это сколько угодно вхождений именно точки. Вообще внутри символьных классов только два метасимвола: "^" если стоит в начале класса и "-" если стоит не в начале класса.
Ну зачем вы так. Шаблоны компилируются один раз после изменения. Как правило первым их смотрит вебмастер, т.е. на его заход и приходится эта нагрузка, далее просто подключаются откомпилированные файлы.
А вы не задумывались, что в Смарти шаблоны после компиляции именно так и выглядят?