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

Тема в разделе "PHP", создана пользователем x@nder, 5 мар 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. x@nder

    x@nder Постоялец

    Регистр.:
    3 апр 2007
    Сообщения:
    128
    Симпатии:
    5
    Есть куча десктопных тулз, как отдельных так и в комплекте.

    А есть ли вот такой скрипт на PHP4?
     
  2. dee_motard

    dee_motard

    Регистр.:
    26 июл 2008
    Сообщения:
    247
    Симпатии:
    76
    ыыы.. Ну например,

    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'=>'Владимир Владимирович',
    )


     
  3. nuke333

    nuke333 Создатель

    Регистр.:
    8 дек 2008
    Сообщения:
    47
    Симпатии:
    12

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

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

    qwyjibo Постоялец

    Регистр.:
    27 янв 2009
    Сообщения:
    64
    Симпатии:
    12
    http://mrkto.com/synonimizer_php/
     
  5. Grabus

    Grabus Постоялец

    Регистр.:
    7 дек 2007
    Сообщения:
    91
    Симпатии:
    31
    а с множественными вложениями?
    по типу:
    Вася пошел делать {кофе|чай|компот} {с {сахаром|сахарозаменителем}|без сахара}
     
  6. grey109

    grey109

    Регистр.:
    3 апр 2007
    Сообщения:
    176
    Симпатии:
    19
    Как-то так:

    <?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)]));
    }

    ?>
     
    Grabus нравится это.
  7. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Я не смог заставить работать предыдущий пример. Долго пытался.
    В результате переделал вот в это:

    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, а как закончились - выходить.
    Но я сделал самым тупым способом - и он все равно оказался крайне быстр. Лень еще что-то оптимизировать. Не знаю, почему прошлый пример у меня не заработал, но если у кого были те же проблемы - держите..
     
  8. diexard

    diexard Писатель

    Регистр.:
    22 мар 2009
    Сообщения:
    7
    Симпатии:
    1
    Вот нашел случайно "Генератор описаний и ссылок с анкорами" (на РНР)
    ссылка: http://humbert.ru/download/4/
     
    zikosa нравится это.
Статус темы:
Закрыта.