Kolyaj

Kolyaj
Рейтинг
69
Регистрация
28.03.2006
Deni:
Только текст идет без переноса строки одним сплошняком

Это в браузере, в исходном коде с переносами.

Если надо чтоб в браузере было с переносами замените последнюю строчку на

echo implode("<br><br>", $choices); 
Deni:
Kolyaj, А не были бы столь любезны изменить чуть скрипт что бы он выводил не одно значение а весь список возможных как это реализовано у Vladimir_Rublin только без пробелов между строками?

Скоро родится новый опен-соурс продукт :) . А пока очередная версия


<?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 - защита от зацикливания, если это количество раз содержимое массива с результатами менятся не будет, то вылетаем из цикла.

На выходе получим список вариантов, разделенных пустой строкой.

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);
?>
MineOptim:
А мне так ниразу ничего не пришло, хотя подписался почти в самом начале создания топика

А я думал я один такой :)

pro-maker,


<?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% всего затраченного процессорного времени ?

Ну зачем вы так. Шаблоны компилируются один раз после изменения. Как правило первым их смотрит вебмастер, т.е. на его заход и приходится эта нагрузка, далее просто подключаются откомпилированные файлы.

ZiNTeR:
ЧТо касается производительности - то тут <?=$main->get_menu()?> нет равных.

А вы не задумывались, что в Смарти шаблоны после компиляции именно так и выглядят?

Всего: 1025