За последние 24 часа нас посетили 20107 программистов и 1252 робота. Сейчас ищут 537 программистов ...

ББ Кодо Генератор

Тема в разделе "Решения, алгоритмы", создана пользователем Mr.M.I.T., 22 янв 2009.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Как пользоваться см. пример
    PHP:
    1. <?
    2. /*
    3. -----------------------
    4. (c)Mr.M.I.T.
    5. Спамм: [url=http://mit-home.nov.ru]http://mit-home.nov.ru[/url]
    6. -----------------------
    7. Название: BazZyzy
    8. Версия: 1.1
    9. Задача: Парсить ББ Коды, РеПарсить ББ Коды, Генерировать ББ коды из массива
    10. Страна: Great Russia, 2008-2009
    11. Для: Тех кому лень писать регулярки с ББ Кодами вручную
    12. -----------------------
    13. Уровень оптимизации:35%
    14. Время которое автор потратил на тесты: 15 мин
    15. Процент качества: 55%
    16. Процент удобства: 90%
    17. Процент реалий от ожиданий: 65%
    18. Время разработки класса: 4,5-5 часов
    19. Возможные ошибка: ожидаемы, но не факт
    20. -----------------------
    21. */
    22.  
    23.  
    24.  
    25. class BBCodes {
    26.    public static $cnf=array();
    27.    /*
    28.     array(
    29.       bb_data_dir=>папка куда кешировать,
    30.       bb_cache_on=false\true кеш ,
    31.     )
    32.    */
    33.    public $ident,$bbdata_reg,$bbdata_rep,$tags,$rep;
    34.    function __construct($ident,$cnf=0) {
    35.        if($cnf)self::$cnf=$cnf;
    36.        if($bbzak=$this->NotCnfSet()) trigger_error("Ошибка: не определён параметр конфигурации '$bbzak'",E_USER_ERROR);
    37.        $this->ident=$ident;
    38.        $this->ChanceCheckBBData();
    39.    }
    40.    private function ChanceCheckBBData(){
    41.        if($this->Is_BBData()){
    42.            include $this->GetBBDir();
    43.            $this->bbdata_reg=$data['reg'];
    44.            $this->bbdata_rep=$data['rep'];
    45.        }
    46.        return false;
    47.    }
    48.    private function NotCnfSet() {
    49.        $mz=array("bb_data_dir");
    50.        for($i=0,$c=count($mz);$i<$c;$i++) {
    51.            if(!self::$cnf[$mz[$i]]) return $mz[$i];
    52.        }
    53.        return false;
    54.    }
    55.    function Is_BBData() {
    56.        if(file_exists($this->GetBBDir()))
    57.           return true;
    58.        return false;
    59.    }
    60.    function BBSet($tag,$attr=0) {
    61.      if(!is_array($tag)) {
    62.          $arr=array($tag);
    63.          if($attr)$arr[]=$attr;
    64.          $this->tags[]=$arr;
    65.      }elseif(!is_array($tag[0])) {
    66.          $attr=array_slice($tag,1);
    67.          $this->BBSet($tag[0],$attr);
    68.      }else{
    69.          for($i=0,$c=count($tag);$i<$c;$i++) {
    70.              $this->BBSet($tag[$i]);
    71.          }
    72.      }
    73.    }
    74.    function RepSet($tag,$attr=0) {
    75.      if(!is_array($tag)) {
    76.          $arr=array($tag);
    77.          if($attr)$arr[]=$attr;
    78.          $this->rep[]=$arr;
    79.      }elseif(!is_array($tag[0])) {
    80.          $attr=array_slice($tag,1);
    81.          $this->RepSet($tag[0],$attr);
    82.      }else{
    83.          for($i=0,$c=count($tag);$i<$c;$i++) {
    84.              $this->RepSet($tag[$i]);
    85.          }
    86.      }
    87.    }
    88.  
    89.    function BBParse($text){
    90.        if($this->tags && $this->rep &&
    91.             (!$this->bbdata_rep || !$this->bbdata_reg))
    92.                $this->CompileRegular();
    93.        $text=preg_replace($this->bbdata_reg['is'],$this->bbdata_rep['is'],$text);
    94.        return $text;
    95.    }
    96.    function R_BBParse($text){
    97.        if($this->tags && $this->rep &&
    98.            (!$this->bbdata_rep || !$this->bbdata_reg))
    99.               $this->CompileRegular();
    100.        $text=preg_replace($this->bbdata_reg['re'],$this->bbdata_rep['re'],$text);
    101.        return $text;
    102.    }
    103.    private function CompileRegular(){
    104.        $bbnot=array("MainAttr","ContentAttr");
    105.        for($i=0,$c=count($this->tags);$i<$c;$i++){
    106.            $regsum=array();$z=1;
    107.            preg_match_all("#{(.+?)}#i",$this->rep[$i][1][0].$this->rep[$i][1][1],$repsum);
    108.            $repsum=$repsum[1];
    109.            $tag='#\['.quotemeta($this->tags[$i][0]);
    110.            $retag="[".$this->tags[$i][0];
    111.            if(is_array($attr=$this->tags[$i][1])){
    112.              if(in_array('MainAttr',$attr) || $attr['MainAttr']){
    113.                 $tag.="\=".($attr["MainAttr"]?"({$attr['MainAttr']})":"(.+?)");
    114.                 $knm=array_search("MainAttr",$repsum)+1;
    115.                 $retag.="=\\{$knm}";
    116.                 $regsum['to'][]="{MainAttr}";
    117.                 $regsum['on'][]="\\{$z}";
    118.                 $z++;
    119.              }
    120.              foreach($attr as $key=>$val){
    121.                  if($nmrc=is_numeric($key))$bazyzy=$val; else $bazyzy=$key;
    122.                  if(in_array($bazyzy,$bbnot)) continue;
    123.                  $tag.="[\s]+$bazyzy\=".(!$nmrc?"($val)":"(.+?)");
    124.                  $knm=array_search($bazyzy,$repsum)+1;
    125.                  $retag.=" ".$bazyzy."=\\".$knm;
    126.                  $regsum['to'][]="{".$bazyzy."}";
    127.                  $regsum['on'][]="\\".$z;
    128.                  $z++;
    129.              }
    130.            }
    131.            $knm=(in_array("ContentAttr",$repsum))?array_search("ContentAttr",$repsum)+1:count($repsum)+1;
    132.            $regsum['to'][]="{ContentAttr}";
    133.            $regsum['on'][]="\\".$z;
    134.            $tag.="\](?s)".($attr['ContentAttr']?"({$attr['ContentAttr']})":"(.+?)")."\[\/".quotemeta($this->tags[$i][0])."\]#i";
    135.            $retag.=']\\'.$knm.'[/'.$this->tags[$i][0].']';
    136.            $this->bbdata_reg['is'][]=$tag;
    137.            $this->bbdata_rep['re'][]=$retag;
    138.  
    139.            $tag=$this->rep[$i][0];
    140.            $attr=$this->rep[$i][1];
    141.            $reptag="<$tag";
    142.            $rereptag="#<".quotemeta($tag);
    143.            if($attr[0]) {
    144.               $reptag.=" ".$attr[0];
    145.               $rereptag.=" ".$attr[0];
    146.            }
    147.            $reptag.=">";
    148.            $rereptag.=">";
    149.            if(!$attr[1]){
    150.               $reptag.="\\".$knm;
    151.               $rereptag.="(?s)".($this->tags[$i][1]['ContentAttr']?"({$this->tags[$i][1]['ContentAttr']})":"(.+?)");
    152.            }else{
    153.               $reptag.=$attr[1];
    154.               $rereptag.="(?s)".$attr[1];
    155.            }
    156.            if(!empty($attr)){
    157.               $reptag=str_replace($regsum['to'],$regsum['on'],$reptag);
    158.             }
    159.            $reptag.="</".$tag.">";
    160.            $GLOBALS['glo_attr']=$this->tags[$i][1];
    161.            $rereptag=preg_replace_callback(
    162.                                   "#{(.+)}#iU",
    163.                                        create_function('$m',
    164.                                                        '$res="";
    165.                                                        if($r=$GLOBALS["glo_attr"][$m[1]]) $res="($r)";
    166.                                                        else $res="(.+?)";
    167.                                                        return $res;
    168.                                                       '),
    169.                                                           $rereptag);
    170.            $rereptag.="<\/".quotemeta($tag).">#i";
    171.            $this->bbdata_rep['is'][]=$reptag;
    172.            $this->bbdata_reg['re'][]=$rereptag;
    173.        }
    174.    }
    175.  
    176.    function Clear($ident=0){
    177.        if(!$ident) $ident=$this->ident;
    178.        $dir=$this->GetBBDir();
    179.        if(file_exists($dir)){
    180.           if(unlink($dir)){
    181.               $this->bbdata_reg='';
    182.               $this->bbdata_rep='';
    183.               return true;
    184.           }
    185.        }
    186.        return false;
    187.    }
    188.    private function GetBBDir(){
    189.        return $_SERVER['DOCUMENT_ROOT'].self::$cnf['bb_data_dir'].'/'.$this->ident.".php";
    190.    }
    191.    function __destruct() {
    192.        $dir=$this->GetBBDir();
    193.        if(!file_exists($dir) && $this->bbdata_reg && $this->bbdata_rep && self::$cnf['bb_cache_on']) {
    194.            $out="<?\$data['reg']=".var_export($this->bbdata_reg,1).";
    195.                \$data['rep']=".var_export($this->bbdata_rep,1).";?".">";
    196.            file_put_contents($dir,$out);
    197.        }
    198.    }
    199. }
    200. ?>
    201.  
    Пример
    PHP:
    1. <?
    2. bbcodes::$cnf=array("bb_data_dir"=>'/bbcode_cache',"bb_cache_on"=>1);
    3. $bb=new bbcodes("example");
    4. $bb->BBSet(array(
    5.               array("b"),
    6.               array("size","MainAttr"=>"[0-9]+"),
    7.               array("align","MainAttr","color"),
    8.               array("zhozho","MainAttr",'gramm'=>"(?:[0-9]+)\-(?:[0-9]+)","ContentAttr"=>"[\w]+?"),
    9.               ));
    10. $bb->RepSet(array(
    11.                array("b"),
    12.                array("font","style='font-size:{MainAttr}px'"),
    13.                array("div","align='{MainAttr}' style='color:{color};'"),
    14.                array("span","style='border:2px solid red;padding:7px;'","<u>{ContentAttr}</u> - выпил где-то {gramm} и теперь ему {MainAttr}"),
    15.               ));
    16. // убрать тире в бб кодах
    17. $parseToHtml=$bb->BBParse("
    18.    dfsdfsdfsdf
    19.    sf[-b]sdfsdfsdf
    20.    s[-/b]<br>[-align=center color=red]
    21.           fsdfsdfsdfsdfsdf
    22.           [-/align]<br>
    23.    s[-size=25]dfsdfs[-/size]df<br><br>
    24.    [-zhozho=всё пофиг gramm=200-300]Mitusbka[/zhozho]
    25. ");
    26. print "BB:".$parseToHtml."<br><br><br>";       // Parse
    27. print "REE: ".$bb->R_BBParse($parseToHtml);    // ReParse
    28. if(rand(0,1)) {
    29.      if($bb->Clear())
    30.         print "<br><h3>Судьба удалила кеш,но он будет обновлён</h3>";
    31. }
    32. ?>
     
  2. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    и кстати этого вполне достаточно, ведь коммпилятор отработывает только один раз, результаты кешируются в файл.
     
  3. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Пока программисты разрабатывают приложения для самообразования и других, кодеры стрегут деньги на готовых вариантах =)
     
  4. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Kreker
    на фриланс чтоли заходил? :)
     
  5. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Mr.M.I.T.
    Да не, не обращай внимания. Это у меня просто денежный кризис. С лета не заработал ни копейки. В начале осени свои проекты делал, планировал дальнейшие проекты и учебу. А потом попросили сайт сделать. Делал 2,5 месяца, назвал копеечную сумму. Заказчик офигел от сайта. Его брат потом мне рассказывал про эмоции самого заказчика. Но когда пришло время платить заказчик слинял (ну месяц уже достучаться не могу). Все мои планы по покупкам, отдыху рухнули. В итоге я на долгах + сессию оочень затянул. Если бы сайт не делал, отдыхал бы еще с конца декабря, а сейчас до сих пор сдаюсь + покупать один предмет придется.
    Да и еще смотрю на то, как некоторые зашибают деньги (в том числе и люди среди знакомых-охламонов), обидно становится, что я такой лузер.
    Просто денежный вопрос для меня сейчас стоит остро -- хотел квартиру снимать, чтобы с девушкой пожить, а потом жениться...
    Вот такие пироги.
     
  6. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    Я помню тоже был маленький проект... штуку должны были отдать :(( Да там бабка стерва попалась - каждый раз говорила что что-то не доделали, хотя об этом и речи не было. Потом заявила что в ее компании кто0-то украл из сейфа деньги и документы... потом вообще пропала :(((( Я ей там такую оптимизацию провел кода... с приятелем прокачали в нете, ПР подняли до 4 (((((
    Еще орала что у нее в опере от 2000 сессии не работают :))))) Я толго ржал... но сволочь смыслась :(
     
  7. Kreker, у всех так было. :)
    Я тоже миллионов не зарабатваю )
     
  8. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    никогда не отдавайте сорцы до оплаты

    специальный такой, девушке на палец??
     
  9. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Не, я ничего и не отдал. Все у меня.

    Не, сначала надо пожить вместе, прежде чем такой покупать. Имел ввиду в инсте покупать экзамен один придется, а потом еще сдавать на более высокий бал :)

    Еще плохо то, что очередной более-менее нормальный проект в портфолио не попал. И у меня опять остались 2 html странички :)

    Может он еще и вернется, кто его знает. Может денег сейчас нет, да оправдываться не хочет. Да я уже и сам не знаю, хочу ли я этого. Ведь сайт можно за пару дней переделать и раза в два дороже продать, если купит кто :)

    Сестра себе хочет сделать сайт. Мне не доверяет, подозреваю, что думает, что я не способен сделать нормальный сайт. Звонит в веб-студию, ей называют цену в 80 т.р. Теперь ищет на Украине студии, думает, что там дешевле сделают...
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    +1, та же фигня, с конца лета и до конца декабря ничего не ловилось ((
     
  11. Не знаю, у меня работы много, и почти никого не ищу, сами находят ))
     
  12. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    флоппик, хорошего спеца видно ;))) А сарафанное радио самое лучшее :))
    Смотри, через пару месяцев будешь тестить систему :))))
     
  13. Я с тобой работать не буду. Я умный, мне одного прецендента хватает. А другим умным людям хватает ума прецендентов не создавать.
     
  14. блудный сын

    блудный сын Активный пользователь

    С нами с:
    18 июн 2008
    Сообщения:
    632
    Симпатии:
    0
    Ну так поделился бы с товарищами! :)
     
  15. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Президенту скажи ;)