Как пользоваться см. пример PHP: <? /* ----------------------- (c)Mr.M.I.T. Спамм: [url=http://mit-home.nov.ru]http://mit-home.nov.ru[/url] ----------------------- Название: BazZyzy Версия: 1.1 Задача: Парсить ББ Коды, РеПарсить ББ Коды, Генерировать ББ коды из массива Страна: Great Russia, 2008-2009 Для: Тех кому лень писать регулярки с ББ Кодами вручную ----------------------- Уровень оптимизации:35% Время которое автор потратил на тесты: 15 мин Процент качества: 55% Процент удобства: 90% Процент реалий от ожиданий: 65% Время разработки класса: 4,5-5 часов Возможные ошибка: ожидаемы, но не факт ----------------------- */ class BBCodes { public static $cnf=array(); /* array( bb_data_dir=>папка куда кешировать, bb_cache_on=false\true кеш , ) */ public $ident,$bbdata_reg,$bbdata_rep,$tags,$rep; function __construct($ident,$cnf=0) { if($cnf)self::$cnf=$cnf; if($bbzak=$this->NotCnfSet()) trigger_error("Ошибка: не определён параметр конфигурации '$bbzak'",E_USER_ERROR); $this->ident=$ident; $this->ChanceCheckBBData(); } private function ChanceCheckBBData(){ if($this->Is_BBData()){ include $this->GetBBDir(); $this->bbdata_reg=$data['reg']; $this->bbdata_rep=$data['rep']; } return false; } private function NotCnfSet() { $mz=array("bb_data_dir"); for($i=0,$c=count($mz);$i<$c;$i++) { if(!self::$cnf[$mz[$i]]) return $mz[$i]; } return false; } function Is_BBData() { if(file_exists($this->GetBBDir())) return true; return false; } function BBSet($tag,$attr=0) { if(!is_array($tag)) { $arr=array($tag); if($attr)$arr[]=$attr; $this->tags[]=$arr; }elseif(!is_array($tag[0])) { $attr=array_slice($tag,1); $this->BBSet($tag[0],$attr); }else{ for($i=0,$c=count($tag);$i<$c;$i++) { $this->BBSet($tag[$i]); } } } function RepSet($tag,$attr=0) { if(!is_array($tag)) { $arr=array($tag); if($attr)$arr[]=$attr; $this->rep[]=$arr; }elseif(!is_array($tag[0])) { $attr=array_slice($tag,1); $this->RepSet($tag[0],$attr); }else{ for($i=0,$c=count($tag);$i<$c;$i++) { $this->RepSet($tag[$i]); } } } function BBParse($text){ if($this->tags && $this->rep && (!$this->bbdata_rep || !$this->bbdata_reg)) $this->CompileRegular(); $text=preg_replace($this->bbdata_reg['is'],$this->bbdata_rep['is'],$text); return $text; } function R_BBParse($text){ if($this->tags && $this->rep && (!$this->bbdata_rep || !$this->bbdata_reg)) $this->CompileRegular(); $text=preg_replace($this->bbdata_reg['re'],$this->bbdata_rep['re'],$text); return $text; } private function CompileRegular(){ $bbnot=array("MainAttr","ContentAttr"); for($i=0,$c=count($this->tags);$i<$c;$i++){ $regsum=array();$z=1; preg_match_all("#{(.+?)}#i",$this->rep[$i][1][0].$this->rep[$i][1][1],$repsum); $repsum=$repsum[1]; $tag='#\['.quotemeta($this->tags[$i][0]); $retag="[".$this->tags[$i][0]; if(is_array($attr=$this->tags[$i][1])){ if(in_array('MainAttr',$attr) || $attr['MainAttr']){ $tag.="\=".($attr["MainAttr"]?"({$attr['MainAttr']})":"(.+?)"); $knm=array_search("MainAttr",$repsum)+1; $retag.="=\\{$knm}"; $regsum['to'][]="{MainAttr}"; $regsum['on'][]="\\{$z}"; $z++; } foreach($attr as $key=>$val){ if($nmrc=is_numeric($key))$bazyzy=$val; else $bazyzy=$key; if(in_array($bazyzy,$bbnot)) continue; $tag.="[\s]+$bazyzy\=".(!$nmrc?"($val)":"(.+?)"); $knm=array_search($bazyzy,$repsum)+1; $retag.=" ".$bazyzy."=\\".$knm; $regsum['to'][]="{".$bazyzy."}"; $regsum['on'][]="\\".$z; $z++; } } $knm=(in_array("ContentAttr",$repsum))?array_search("ContentAttr",$repsum)+1:count($repsum)+1; $regsum['to'][]="{ContentAttr}"; $regsum['on'][]="\\".$z; $tag.="\](?s)".($attr['ContentAttr']?"({$attr['ContentAttr']})":"(.+?)")."\[\/".quotemeta($this->tags[$i][0])."\]#i"; $retag.=']\\'.$knm.'[/'.$this->tags[$i][0].']'; $this->bbdata_reg['is'][]=$tag; $this->bbdata_rep['re'][]=$retag; $tag=$this->rep[$i][0]; $attr=$this->rep[$i][1]; $reptag="<$tag"; $rereptag="#<".quotemeta($tag); if($attr[0]) { $reptag.=" ".$attr[0]; $rereptag.=" ".$attr[0]; } $reptag.=">"; $rereptag.=">"; if(!$attr[1]){ $reptag.="\\".$knm; $rereptag.="(?s)".($this->tags[$i][1]['ContentAttr']?"({$this->tags[$i][1]['ContentAttr']})":"(.+?)"); }else{ $reptag.=$attr[1]; $rereptag.="(?s)".$attr[1]; } if(!empty($attr)){ $reptag=str_replace($regsum['to'],$regsum['on'],$reptag); } $reptag.="</".$tag.">"; $GLOBALS['glo_attr']=$this->tags[$i][1]; $rereptag=preg_replace_callback( "#{(.+)}#iU", create_function('$m', '$res=""; if($r=$GLOBALS["glo_attr"][$m[1]]) $res="($r)"; else $res="(.+?)"; return $res; '), $rereptag); $rereptag.="<\/".quotemeta($tag).">#i"; $this->bbdata_rep['is'][]=$reptag; $this->bbdata_reg['re'][]=$rereptag; } } function Clear($ident=0){ if(!$ident) $ident=$this->ident; $dir=$this->GetBBDir(); if(file_exists($dir)){ if(unlink($dir)){ $this->bbdata_reg=''; $this->bbdata_rep=''; return true; } } return false; } private function GetBBDir(){ return $_SERVER['DOCUMENT_ROOT'].self::$cnf['bb_data_dir'].'/'.$this->ident.".php"; } function __destruct() { $dir=$this->GetBBDir(); if(!file_exists($dir) && $this->bbdata_reg && $this->bbdata_rep && self::$cnf['bb_cache_on']) { $out="<?\$data['reg']=".var_export($this->bbdata_reg,1)."; \$data['rep']=".var_export($this->bbdata_rep,1).";?".">"; file_put_contents($dir,$out); } } } ?> Пример PHP: <? bbcodes::$cnf=array("bb_data_dir"=>'/bbcode_cache',"bb_cache_on"=>1); $bb=new bbcodes("example"); $bb->BBSet(array( array("b"), array("size","MainAttr"=>"[0-9]+"), array("align","MainAttr","color"), array("zhozho","MainAttr",'gramm'=>"(?:[0-9]+)\-(?:[0-9]+)","ContentAttr"=>"[\w]+?"), )); $bb->RepSet(array( array("b"), array("font","style='font-size:{MainAttr}px'"), array("div","align='{MainAttr}' style='color:{color};'"), array("span","style='border:2px solid red;padding:7px;'","<u>{ContentAttr}</u> - выпил где-то {gramm} и теперь ему {MainAttr}"), )); // убрать тире в бб кодах $parseToHtml=$bb->BBParse(" dfsdfsdfsdf sf[-b]sdfsdfsdf s[-/b]<br>[-align=center color=red] fsdfsdfsdfsdfsdf [-/align]<br> s[-size=25]dfsdfs[-/size]df<br><br> [-zhozho=всё пофиг gramm=200-300]Mitusbka[/zhozho] "); print "BB:".$parseToHtml."<br><br><br>"; // Parse print "REE: ".$bb->R_BBParse($parseToHtml); // ReParse if(rand(0,1)) { if($bb->Clear()) print "<br><h3>Судьба удалила кеш,но он будет обновлён</h3>"; } ?>
и кстати этого вполне достаточно, ведь коммпилятор отработывает только один раз, результаты кешируются в файл.
Пока программисты разрабатывают приложения для самообразования и других, кодеры стрегут деньги на готовых вариантах =)
Mr.M.I.T. Да не, не обращай внимания. Это у меня просто денежный кризис. С лета не заработал ни копейки. В начале осени свои проекты делал, планировал дальнейшие проекты и учебу. А потом попросили сайт сделать. Делал 2,5 месяца, назвал копеечную сумму. Заказчик офигел от сайта. Его брат потом мне рассказывал про эмоции самого заказчика. Но когда пришло время платить заказчик слинял (ну месяц уже достучаться не могу). Все мои планы по покупкам, отдыху рухнули. В итоге я на долгах + сессию оочень затянул. Если бы сайт не делал, отдыхал бы еще с конца декабря, а сейчас до сих пор сдаюсь + покупать один предмет придется. Да и еще смотрю на то, как некоторые зашибают деньги (в том числе и люди среди знакомых-охламонов), обидно становится, что я такой лузер. Просто денежный вопрос для меня сейчас стоит остро -- хотел квартиру снимать, чтобы с девушкой пожить, а потом жениться... Вот такие пироги.
Я помню тоже был маленький проект... штуку должны были отдать ( Да там бабка стерва попалась - каждый раз говорила что что-то не доделали, хотя об этом и речи не было. Потом заявила что в ее компании кто0-то украл из сейфа деньги и документы... потом вообще пропала ((( Я ей там такую оптимизацию провел кода... с приятелем прокачали в нете, ПР подняли до 4 ((((( Еще орала что у нее в опере от 2000 сессии не работают )))) Я толго ржал... но сволочь смыслась
Не, я ничего и не отдал. Все у меня. Не, сначала надо пожить вместе, прежде чем такой покупать. Имел ввиду в инсте покупать экзамен один придется, а потом еще сдавать на более высокий бал Еще плохо то, что очередной более-менее нормальный проект в портфолио не попал. И у меня опять остались 2 html странички Может он еще и вернется, кто его знает. Может денег сейчас нет, да оправдываться не хочет. Да я уже и сам не знаю, хочу ли я этого. Ведь сайт можно за пару дней переделать и раза в два дороже продать, если купит кто Сестра себе хочет сделать сайт. Мне не доверяет, подозреваю, что думает, что я не способен сделать нормальный сайт. Звонит в веб-студию, ей называют цену в 80 т.р. Теперь ищет на Украине студии, думает, что там дешевле сделают...
флоппик, хорошего спеца видно )) А сарафанное радио самое лучшее ) Смотри, через пару месяцев будешь тестить систему )))
Я с тобой работать не буду. Я умный, мне одного прецендента хватает. А другим умным людям хватает ума прецендентов не создавать.