Deni: Kolyaj, А не были бы столь любезны изменить чуть скрипт что бы он выводил не одно значение а весь список возможных как это реализовано у Vladimir_Rublin только без пробелов между строками?
Скоро родится новый опен-соурс продукт :) . А пока очередная версия
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 - защита от зацикливания, если это количество раз содержимое массива с результатами менятся не будет, то вылетаем из цикла.
На выходе получим список вариантов, разделенных пустой строкой.
Vladimir_Rublin: Там бы ещё стравнение не помешало, если $v содержит только 1 элемент, то возвращать его вместе со скобками (на случай рандомизации текста под Wiki разметку).
Тогда лучше сразу обрабатывать только "правильные" конструкции, т.е. фигурные скобки, внутри которых нет других фигурных скобок и есть вертикальная черта. Причем вертикальная черта в свою очередь тоже может экранироваться двойным начертанием ||.
<?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);
?>
<?php
function callback($matches) {
$v = explode("|", $matches[1]);
return $v[array_rand($v)];
}
$str = "Это {простой|не сложный} но {сильный|нужный} {сервис|интернет сервис|утиль|веб-сустем}, который {несомненно|определённо|стопудово|полюбому} будет полезен {веб|web}-мастерам и {SE оптимизаторам|труженикам в сфере оптимизации веб для поисковых систем}.
{Сервис|Интернет сервис} помогает {избавить себя от|избежать} пустой траты времени, и высвободить {это|освободившееся} время для {куража с девками|поездки в Венецию|трёхмесячного отдыха на Сейшельских островах|полёта в качестве космического туриста на околоземную орбиту}.";
echo preg_replace_callback("/\{(.*?)\}/", "callback", $str);
?>
Vladimir_Rublin: Я конечно не математик, но формула примерно такая:
КОЛ-ВО_ВАРИАНТОВ = N ^ M
где N=число мест замены, M=количество вариантов замен в самом объёмном блоке.
То есть для того текста, что я привёл в пример, у нас получается 10 тыс. вариантов.
Решение не верное, а ответ почти верный 😆 . Надо перемножить количество вариантов в каждом блоке, т.е. в вашем примере будет 10240 вариантов.
Segey: Символьные классы так не пишутся, нужно написать [.]* это значит что сколько угодно вхождений любых символов, кроме переноса строки.
Зачем людей в заблуждение вводите. Точка - метасимвол, означающий любой символ кроме \r и \n. В квадратных скобках точка становится просто символом, т.е. [.]* это сколько угодно вхождений именно точки. Вообще внутри символьных классов только два метасимвола: "^" если стоит в начале класса и "-" если стоит не в начале класса.
Зингельшухер: А вы не задумывались что компиляция это ресурсоёмкий процесс занимающий от 50-ти до 90% всего затраченного процессорного времени ?
Ну зачем вы так. Шаблоны компилируются один раз после изменения. Как правило первым их смотрит вебмастер, т.е. на его заход и приходится эта нагрузка, далее просто подключаются откомпилированные файлы.
Только текст идет без переноса строки одним сплошняком
Это в браузере, в исходном коде с переносами.
Если надо чтоб в браузере было с переносами замените последнюю строчку на
echo implode("<br><br>", $choices);Kolyaj, А не были бы столь любезны изменить чуть скрипт что бы он выводил не одно значение а весь список возможных как это реализовано у Vladimir_Rublin только без пробелов между строками?
Скоро родится новый опен-соурс продукт :) . А пока очередная версия
И небольшие пояснялки:
CHOICE_COUNT - нужное количество вариантов
MAX_REST_COUNT - защита от зацикливания, если это количество раз содержимое массива с результатами менятся не будет, то вылетаем из цикла.
На выходе получим список вариантов, разделенных пустой строкой.
Там бы ещё стравнение не помешало, если $v содержит только 1 элемент, то возвращать его вместе со скобками (на случай рандомизации текста под Wiki разметку).
Тогда лучше сразу обрабатывать только "правильные" конструкции, т.е. фигурные скобки, внутри которых нет других фигурных скобок и есть вертикальная черта. Причем вертикальная черта в свою очередь тоже может экранироваться двойным начертанием ||.
А мне так ниразу ничего не пришло, хотя подписался почти в самом начале создания топика
А я думал я один такой :)
pro-maker,
Я конечно не математик, но формула примерно такая:
КОЛ-ВО_ВАРИАНТОВ = N ^ M
где N=число мест замены, M=количество вариантов замен в самом объёмном блоке.
То есть для того текста, что я привёл в пример, у нас получается 10 тыс. вариантов.
Решение не верное, а ответ почти верный 😆 . Надо перемножить количество вариантов в каждом блоке, т.е. в вашем примере будет 10240 вариантов.
snoopckuu, а кто первоисточник?
http://www.gregsadetsky.com/aol-data/
Символьные классы так не пишутся, нужно написать [.]* это значит что сколько угодно вхождений любых символов, кроме переноса строки.
Зачем людей в заблуждение вводите. Точка - метасимвол, означающий любой символ кроме \r и \n. В квадратных скобках точка становится просто символом, т.е. [.]* это сколько угодно вхождений именно точки. Вообще внутри символьных классов только два метасимвола: "^" если стоит в начале класса и "-" если стоит не в начале класса.
А вы не задумывались что компиляция это ресурсоёмкий процесс занимающий от 50-ти до 90% всего затраченного процессорного времени ?
Ну зачем вы так. Шаблоны компилируются один раз после изменения. Как правило первым их смотрит вебмастер, т.е. на его заход и приходится эта нагрузка, далее просто подключаются откомпилированные файлы.
ЧТо касается производительности - то тут <?=$main->get_menu()?> нет равных.
А вы не задумывались, что в Смарти шаблоны после компиляции именно так и выглядят?