Всем привет! Делаю обработчик bb-кода с применением регулярных выражении PHP: <?php $find = "'\[quote=(.*?)\](.*)\[/quote\]'s"; $replace = printBox("\\1 писал(а):", "\\2"); $text = preg_replace($find, $replace, $text); В принципе этот код работает, НО когда появляется цитата внутри цитаты, то у той цитаты, котороя находится внутри bb-код не заменяется, т.е. она так и выводится в виде bb-кода. Пожалуйста подскажите как сделать чтобы во всех вложенных цитатах бб-код тоже заменялся в preg_replace? Заранее благодарен за ответы
хотя и писать не надо PHP: <? // $thisbb - массив с названиями бб кодов которые нужно проверить типа array('quote','code') function bbcontrol($text,$thisbb) { for($i=0,$c=count($thisbb);$i<$c;$i++) { preg_match_all("#\[(".$thisbb[$i].")\]#isU",$text,$openbb); preg_match_all("#\[\/(".$thisbb[$i].")\]#isU",$text,$closebb); if (count($openbb[1])>count($closebb[1])) { if (preg_match("#\[\/".$thisbb[$i]."\]#is",$text)) { $exp=explode("[/".$thisbb[$i]."]",$text); for($z=0,$k=count($openbb[1])-count($closebb[1]);$z<$k;$z++) { $exp[0].="[/".$thisbb[$i]."]"; } $text=join("[/".$thisbb[$i]."]",$exp); } else { $text=str_replace("[".$thisbb[$i]."]","[".$thisbb[$i]."]",$text); } }else if (count($openbb[1])<count($closebb[1])) { if (preg_match("#\[".$thisbb[$i]."\]#is",$text)) { $exp=explode("[".$thisbb[$i]."]",$text); for($z=0,$k=count($closebb[1])-count($openbb[1]);$z<$k;$z++) { $exp[0].="[".$thisbb[$i]."]"; } $text=join("[".$thisbb[$i]."]",$exp); }else { $text=str_replace("[/".$thisbb[$i]."]","[/".$thisbb[$i]."]",$text); } } } return $text; } ?> естественно на выводе не стоит пользоваться этой функцией, на и вообще на выводе не стоит заменять бб коды, бб коды лучше обрабатывать при добавлении в БД
Около года назад занимался бб-тегами. Скрипт скорее всего бредовый, но он учитывает атрибуты типа [SIZE] и пр. Решения тоже не очень хорошие, но все же: PHP: <?php #Отчистка от font preg_match_all('~<font(.*?)>(.*?)</font>~is', $text, $nofont); if ($nofont[0][0] != "") { for ($i=0;$i<sizeof($nofont[1]);$i++) { $parametr = explode(" ",$nofont[1][$i]); for ($m=1;$m<=sizeof($parametr);$m++) { $textbb[$i] = (!$textbb[$i]) ? $nofont[2][$i] : $textbb[$i]; if (substr($parametr[$m],0,3) == "col") { $tag = preg_replace('~color="(.*?)"~is',"[COLOR=$1]",$parametr[$m]); $textbb[$i] = $tag.$textbb[$i]."[/COLOR]"; } elseif (substr($parametr[$m],0,3) == "siz") { $tag = preg_replace('~size="(.*?)"~is',"[SIZE=$1]",$parametr[$m]); $textbb[$i] = $tag.$textbb[$i]."[/SIZE]"; } elseif (substr($parametr[$m],0,3) == "fam") { $tag = preg_replace('~family="(.*?)"~is',"[FONT=$1]",$parametr[$m]); $textbb[$i] = $tag.$textbb[$i]."[/FONT]"; } } $zamen = $nofont[0][$i]; $zamena[$zamen] = $textbb[$i]; } $text = strtr($text,$zamena); unset($zamen); unset($zamena); } #Чистим <img preg_match_all('~<img(.*?)>~is', $text, $noimg); if ($noimg[0][0] != "") { for ($i=0;$i<sizeof($noimg[1]);$i++) { $tag = preg_replace('~src="(.*?)"(.*)~is',"[img]$1[/img]",$noimg[1][$i]); $zamen = $noimg[0][$i]; $zamena[$zamen] = $tag; } $text = strtr($text,$zamena); unset($zamen); unset($zamena); } #Чистим <a href preg_match_all('~<a(.*?)>(.*?)</a>~is', $text, $nohref); if ($nohref[0][0] != "") { for ($i=0;$i<sizeof($nohref[1]);$i++) { $tag = preg_replace('~href="(.*?)"~is',"[url=$1]",$nohref[1][$i]); $tag = $tag.$nohref[2][$i]."[/url]"; $zamen = $nohref[0][$i]; $zamena[$zamen] = trim($tag); } $text = strtr($text,$zamena); } $protect = array ("<b>"=> "[b]", "</b>"=> "[/b]", "<U>"=> "[u]", "</U>"=> "[/u]", "<EM>"=> "[i]", "</EM>"=> "[/i]", "<center>" => "[C]", "</center>" => "[/C]", "<br>" => "\n" ); global $cleartxt; $cleartxt = strtr($text, $protect); И обратное преобразование: PHP: <?php #Функиция берет html - код и преобразовывает его в bb-тег function nohtml($text) { #Отчистка от font preg_match_all('~<font(.*?)>(.*?)</font>~is', $text, $nofont); for ($i=0;$i<sizeof($nofont[1]);$i++) { $parametr = explode(" ",$nofont[1][$i]); for ($m=1;$m<=sizeof($parametr);$m++) { $textbb[$i] = (!$textbb[$i]) ? $nofont[2][$i] : $textbb[$i]; if (substr($parametr[$m],0,3) == "col") { $tag = preg_replace('~color="(.*?)"~is',"[COLOR=$1]",$parametr[$m]); $textbb[$i] = $tag.$textbb[$i]."[/COLOR]"; } elseif (substr($parametr[$m],0,3) == "siz") { $tag = preg_replace('~size="(.*?)"~is',"[SIZE=$1]",$parametr[$m]); $textbb[$i] = $tag.$textbb[$i]."[/SIZE]"; } elseif (substr($parametr[$m],0,3) == "fam") { $tag = preg_replace('~family="(.*?)"~is',"[FONT=$1]",$parametr[$m]); $textbb[$i] = $tag.$textbb[$i]."[/FONT]"; } } $zamen = $nofont[0][$i]; $zamena[$zamen] = $textbb[$i]; } $text = strtr($text,$zamena); unset($zamen); unset($zamena); #Чистим <img preg_match_all('~<img(.*?)>~is', $text, $noimg); for ($i=0;$i<sizeof($noimg[1]);$i++) { $tag = preg_replace('~src="(.*?)"~is',"[img]$1[/img]",$noimg[1][$i]); $zamen = $noimg[0][$i]; $zamena[$zamen] = $tag; } $text = strtr($text,$zamena); unset($zamen); unset($zamena); #Чистим <a href preg_match_all('~<a(.*?)>(.*?)</a>~is', $text, $nohref); for ($i=0;$i<sizeof($nohref[1]);$i++) { $tag = preg_replace('~href="(.*?)"~is',"[url=$1]",$nohref[1][$i]); $tag = $tag.$nohref[2][$i]."[/url]"; $zamen = $nohref[0][$i]; $zamena[$zamen] = trim($tag); } #preg_replace("/^(http:\/\/[a-z]*\.ru)$/i", "<a href=\"$1\" target=\"_blank\">$1</a>", $url); $text = strtr($text,$zamena); $protect = array ("[b]"=> "<b>", "[/b]"=> "</b>", "[u]"=> "<U>", "[/u]"=> "</U>", "[i]"=> "<EM>", "[/i]"=> "</EM>", "[C]" => "<center>", "[/C]" => "</center>", "<br>" => "\n" ); global $cleartxt; $cleartxt = strtr($text, $protect); } nohtml($text); ?> UPD: Вот фигня! Он повырезал bb-теги!
А как вам такое решение: PHP: <?php function bbcode_quote($text) { $parts = explode('[/quote]', $text); if(($closetagsnum = count($parts) - 1) > 0) { $opentagsnum = 0; for($i = 0; $i <= $closetagsnum; $i++) { $opentagsnum += substr_count($parts[$i], '[quote]'); if($opentagsnum <= $closetagsnum) { $parts_r[] = str_replace('[quote]', '<fieldset><legend>Цитата</legend>', $parts[$i]).'</fieldset>'; } else { $parts_r[] = $parts[$i]; } } $text = implode('', $parts_r); } return $text; } Особо не тестировал, но вроде работает.