Генератор {анкоров|описаний|названий}

Статус
В этой теме нельзя размещать новые ответы.

x@nder

Постоялец
Регистрация
3 Апр 2007
Сообщения
131
Реакции
8
Есть куча десктопных тулз, как отдельных так и в комплекте.

А есть ли вот такой скрипт на PHP4?
 
ыыы.. Ну например,

PHP:
function get_rand($str,$l) {
$arr=explode($l, $str);
return $arr[array_rand($arr)];
}
function parse_rand($str,$arr=array()) {
$str=preg_replace('/\[(.*?)\]/e', 'get_rand("$1?,"/")', $str);
$str=preg_replace('/\((.*?)\)/e', 'get_rand("$1?,"|")', $str);
$str=preg_replace('/\{(.*?)}/e', '$arr[\'$1\']', $str);
return $str;
}

и вызывать по такому типу
PHP:
$text=parse_rand(
'(Привет|Здарова|Хрю) {name}, (Меня зовут|Моё имя|Я известен как) {myname}. МнеI (нравится|по-приколу) (ковырять в носу|полевать в потолок|стоять в очереди). (Если тебе тоже это интересно|Если тебе это противно|Если ты не голубой) (щелкни тут!|кликни здесь). И просто для проверки: (а [1/2/3] б|в [4/5/6] г)',
array(
'myname'=>'Супермен',
'name'=>'Владимир Владимирович',
)
 
ыыы.. Ну например,

PHP:
...
$str=preg_replace('/\[(.*?)\]/e', 'get_rand("$1?,"/")', $str);
$str=preg_replace('/\((.*?)\)/e', 'get_rand("$1?,"|")', $str);
...


насколько я понимаю нужны не вопросики, а двойные ковычки для первого аргумента get_rand()

PHP:
$str=preg_replace('/\[(.*?)\]/e', 'get_rand("$1","/")', $str);
$str=preg_replace('/\((.*?)\)/e', 'get_rand("$1","|")', $str);
 
а с множественными вложениями?
по типу:
Вася пошел делать {кофе|чай|компот} {с {сахаром|сахарозаменителем}|без сахара}
 
Как-то так:

<?php

$text = 'Вася пошел делать {кофе|чай|компот} {с {сахаром|сахарозаменителем}|без сахара}';

$t = preg_replace_callback("/\{([^{}]*?)\}/", "callback", $t);

function callback($matches)
{
$v = preg_split("/(?<!\|)\|(?!\|)/", $matches[1]);
return str_replace("||", "|", (count($v) == 1 ? "{" . $v[0] . "}" : $v[array_rand($v)]));
}

?>
 
Я не смог заставить работать предыдущий пример. Долго пытался.
В результате переделал вот в это:

PHP:
$text = 'Вася пошел делать {кофе|чай|компот} 
  {с {сахаром|сахарозаменителем}|без сахара}';

echo $str = generate($text);

function generate($t) {
  for($i=0;$i<6;$i++)   // макс. уровень вложенности скобочек
      $t = preg_replace_callback("#{([^{}]*?)}#ms", "callback", $t);
  return $t;
}
function callback($matches) {
  $v = explode('|',$matches[1]);
  return $v[rand(0,count($v)-1)];
}

Для 5го php можно вместо вызова много раз preg_replace_callaback добавить в него параметр $count, и как только он станет 0 - выходить.
Можно еще сохранять прошлый результат и сравнивать с текущим - и как только станут равны - выходить (но тогда памяти в 2 раза больше жрет). И еще можно проверять по strstr() пока есть '{' в тексте - вызывать preg_replace_callback, а как закончились - выходить.
Но я сделал самым тупым способом - и он все равно оказался крайне быстр. Лень еще что-то оптимизировать. Не знаю, почему прошлый пример у меня не заработал, но если у кого были те же проблемы - держите..
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху