Модераторы: 2man
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Генератор имён по шаблону 
:(
    Опции темы
Elfet
Дата 17.3.2006, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Имя генерируеться по шаблону. Шаблон состовляеться из руских букв.
Например: лилу
Если в скобках { } указать несколько букв, то случайно выберелться одна из них
Пр: л{аоиу}у
Сюда подойдут имена: лилу, лолу, лалу, ....
В [ ] таких скобках указывается буквы которые идут "как есть"
Пр: {[ди][по][ку][вы]}
Это вернёт один из слогов:
ди, по, ку, вы
Вложеность есть: {[д{аоиу}][п{аоиу}][ку][вы]}
Блоки и буквы можно домножать
Пр: {[ди][по][ку][вы]}*3
Это эквивалентно: {[ди][по][ку][вы]}{[ди][по][ку][вы]}{[ди][по][ку][вы]}
Пр: [а]*2 ~ [а][а]
Пр: ли*2лу*3 ~ лиилууу
То на что домножать можно указывать так 3-7 : случайно выберелься одно число от 3 до 7
Пр: [а]*2-4
Получиться либо [а][а], либо [а][а][а], либо [а][а][а][а]

Класс:
Код



class name_generator {

 var $abc="абвгдеёжзийклмнопрстуфхцчшщъыьэюя";  //Шаблон нижнего регистра
 var $_abc="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"; //Шаблон для перевода в нижний регистр
 var $num="0123456789"; //Шаблон цифр

 var $from;  //Число страта mt_srand
 var $type_up;

//-----------------------------------------
//  Stars
//-----------------------------------------

 function generet($mask,$from)
 {
   $this->from = $from; //Записываем значение

   mt_srand($this->from); //Инициализируем mt_rand

   $mask = $this->low($mask);  //Переводим в нижний регистр

   $name = $this->map($mask,"stat"); //По умолчанию шаблон в статических скобках [], запускаем анализатор

   return $name; //Анализатор возвращает уже готовое имя
 }

//-----------------------------------------
//  Map Func Анализатор работает рекурсивно (первый параметр - маска, второй вызван из какой функции '{}' или '[]')
//-----------------------------------------

 function map($mask,$func)
 {
  $level=0;                      //Уровень вложености, для сбора подмаски
  $in_mask="";                   //Вложенная маска
  $t="";                         //Возврощаемое значение (часть готового имени)
  $now_up = "";                  //Тип подмаски
  $oneof=array();  $in_numer=0;  //Массив для хранения случаеных частей имени и ключ
  for($i=0; $i<strlen($mask); $i++)
  {

             if($this->is_up($mask[$i]))      //Проверям, является ли скобочкой откр. (также в $this->type_up <- тип скоб. )
             {
                $level++;                     //Уровень вверх (Для того чтоб найти потом закрывающую скоб. первого уровня)
                if($level==1)                 //Если скобочка первого уроня (=0), то этот тип и будет типом подмаски
                {
                   $now_up = $this->type_up;  //Он нам нужен щас, $this->type_up потом измениться
                   continue;                  //На следующий шаг цикла, ТАК КАК нам не нужно сознонять в подмаске эту скоб.
                }
             }

             if($this->is_down($mask[$i]))   //Закр. скобка
             {
                $level--;

                if($level==0)                //Ищем закрывающую скобку первой скобки
                {
                    $n="";                   //Умножение скоб.
                    $n2="";                  //Второе число по умножению

                    if($mask[$i+1] == '*')   //Если есть умножение ищем n
                    {
                             $j=$i+1;        //Ищем не другому индеску
                             while( $this->is_num( $mask[++$j] ) )$n .= $mask[$j];             //Собираем число
                                    if( $mask[$j] == '-' && $n != "" )                         //Если есть другое
                                    {
                                      while( $this->is_num( $mask[++$j] ) )$n2 .= $mask[$j];   //Собираем и его
                                      if($n2 > $n)
                                      {
                                       $n = mt_rand( $n , $n2 );                               //Выбираем из чисел
                                      }                                                        //Смещение на '-'
                                      $i++;
                                    }
                             $i++;           //Смещение на '*'
                    }
                    if($n == "")                     //Нашли ли умножение?
                    {
                      $n = 1;
                    }
                    else
                    {
                      $i += strlen($n)+strlen($n2); //Ага, тогда смещаем индекс на число знаков в цифрах (на *,- уже сместили)
                    }

                    for($j=0; $j<$n; $j++)          //Несколько раз ( 1 - n ) бызываем рекурсивную функцию для подмаски с её типом
                        if($func == "map")$oneof[ $in_numer++ ] = $this->map($in_mask,$now_up); //Собираем для выбора
                        else if($func == "stat")$t .= $this->map($in_mask,$now_up);              //Собираем для возврата

                    $in_mask = "";                  //Очищаем подмаску для поиска следующей на уровне один
                    continue;                       //Прыгаем, закрывающая скобка нам не нужна
                }
             }
             if($level > 0)                  //Собираем подмаску, если мы не на первом уровне
                 $in_mask .= $mask[$i];

        if($level == 0)                      //Готовим для возврата
        {
              $n="";                         //Первое число
              $n2="";                        //Второе
              $t_add = $mask[$i];            //Сохроняем умножаемую букву
              if($mask[$i+1] == '*')         //Если умножение букв?  Умножаем - так же
              {
                    $j=$i+1;                 //Индекс для поиска
                    while( $this->is_num( $mask[++$j] ) )$n .= $mask[$j];          //Ищем
                          if( $mask[$j] == '-' && $n != "" )                       //Есть другое число? (n-n2)
                          {
                            while( $this->is_num( $mask[++$j] ) )$n2 .= $mask[$j]; //Ищем другое
                            if($n2 > $n)
                            {
                                $n = mt_rand( $n , $n2 );                          //Выбираем одно число
                            }                                                      //Смещение
                            $i++;
                          }
                   $i++;                     //Смещение
              }

              if($n == "")                   //Если вообще нет чисел
              {
                  $n = 1;
              }
              else
              {
                  $i += strlen($n)+strlen($n2);
              }

              for($j=0; $j<$n; $j++)
                 if($func == "map")$oneof[ $in_numer++ ] = $t_add;     //Собираем массив для выбора в возврат
                 else if($func == "stat")$t .= $t_add;                 //Собираем строку

        }

  }

  if($func == "map")                         //Тип функции выборка
  {
      $grand = mt_rand( 0 , count($oneof)-1 );  //Выбираем случайный элемент

      return $oneof[$grand];                    //Возвращаем его
  }
  else if($func == "stat")                   //Тип - строка
  {
        return $t;
  }
 }



//-----------------------------------------
//  Help Func
//-----------------------------------------

 function is_up($c)
 {
  if($c == '[')
  {
       $this->type_up = "stat";
       return true;
  }
  if($c == '{')
  {
       $this->type_up = "map";
       return true;
  }
  return false;
 }

 function is_down($c)
 {
  if($c == ']')
  {
       return true;
  }
  if($c == '}')
  {
       return true;
  }
  return false;
 }

 function is_num($n)
 {
  $return = ($n=="") ? false : true;
  for($i=0; $i<strlen($n); $i++)
  {
       $in=false;
       for($j=0; $j<strlen($this->num); $j++)
           if( $n[$i] == $this->num[$j] ) $in = true;

       if(!$in)$return = false;
  }
  return $return;
 }

 function low($str)
 {
  return strtr($str,$this->_abc,$this->abc);
 }

}




Вызов:
Код

$gen = new name_generator;

$start = time();

$name .= $gen->generet( $_POST['mask'] , $start  )

$start - типа ключа к имени smile


Попробовать можно тут: http://mellon.ru/namegenerator/

smile

Посмотрите пожалуйста! smile Если какие-нибудь баги? Как можно улучшить?

Если кто придумает хороший шаблон для имени - давайте сюда! smile

Это сообщение отредактировал(а) Elfet - 17.3.2006, 19:18


--------------------
PM MAIL WWW Skype   Вверх
Ciber SLasH
Дата 17.3.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Цитата(Elfet @ 17.3.2006, 19:01 Найти цитируемый пост)
Попробовать можно тут: http://localhost/namegenerator/

Ага, интересная сцылка. smile
PM   Вверх
Elfet
Дата 17.3.2006, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16





--------------------
PM MAIL WWW Skype   Вверх
Ciber SLasH
Дата 17.3.2006, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: нет
Всего: 67



Elfet, такой вопрос: "А для чего эта фишка" ? Я вот помню программку "Генератор матов", так та хоть ясно чё делала, а твоя....

Это сообщение отредактировал(а) Ciber SLasH - 17.3.2006, 19:31
PM   Вверх
Elfet
Дата 17.3.2006, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



А моя генерирует имена smile Бывает полезно в РПГшках. Да и вообще интересно smile


--------------------
PM MAIL WWW Skype   Вверх
IvanB
Дата 18.3.2006, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 23.5.2005
Где: Irkutsk

Репутация: 1
Всего: 5



Вот если бы он ещё более-менее осмысленные имена генерировал, тогда было бы неплохо.
А так - смысла особого не вижу.

Это сообщение отредактировал(а) IvanB - 18.3.2006, 08:25
--------------------
Закон отладки: Каждая последняя ошибка является предпоследней.
PM MAIL ICQ   Вверх
Elfet
Дата 18.3.2006, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



smile Это было бы легче smile Тоже потом сделаю - но это делаеться по базе, а этот по шаблону. Такие имена тоже нужны smile


--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Другие движки / фрейморки | Следующая тема »


 




[ Время генерации скрипта: 0.0552 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.