За последние 24 часа нас посетили 22700 программистов и 1221 робот. Сейчас ищет 741 программист ...

bb-code & регулярные выражения

Тема в разделе "Регулярные выражения", создана пользователем amplifier, 10 дек 2008.

  1. amplifier

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

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    Всем привет!
    Делаю обработчик bb-кода с применением регулярных выражении
    PHP:
    1.  
    2. <?php
    3. $find = "'\[quote=(.*?)\](.*)\[/quote\]'s";
    4. $replace = printBox("\\1 писал(а):", "\\2");
    5. $text = preg_replace($find, $replace, $text);
    6.  
    В принципе этот код работает, НО когда появляется цитата внутри цитаты, то у той цитаты, котороя находится внутри bb-код не заменяется, т.е. она так и выводится в виде bb-кода.
    Пожалуйста подскажите как сделать чтобы во всех вложенных цитатах бб-код тоже заменялся в preg_replace? Заранее благодарен за ответы
     
  2. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    заменять
     
  3. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    хотя и писать не надо
    PHP:
    1. <?
    2. // $thisbb - массив с названиями бб кодов которые нужно проверить типа array('quote','code')
    3. function bbcontrol($text,$thisbb) {
    4.         for($i=0,$c=count($thisbb);$i<$c;$i++) {
    5.            preg_match_all("#\[(".$thisbb[$i].")\]#isU",$text,$openbb);
    6.            preg_match_all("#\[\/(".$thisbb[$i].")\]#isU",$text,$closebb);
    7.            if (count($openbb[1])>count($closebb[1])) {
    8.                if (preg_match("#\[\/".$thisbb[$i]."\]#is",$text)) {
    9.                     $exp=explode("[/".$thisbb[$i]."]",$text);
    10.                 for($z=0,$k=count($openbb[1])-count($closebb[1]);$z<$k;$z++) {
    11.                     $exp[0].="[/".$thisbb[$i]."]";
    12.                 }
    13.                 $text=join("[/".$thisbb[$i]."]",$exp);
    14.               } else {
    15.                 $text=str_replace("[".$thisbb[$i]."]","[".$thisbb[$i]."&#093",$text);
    16.               }
    17.            }else if (count($openbb[1])<count($closebb[1])) {
    18.                if (preg_match("#\[".$thisbb[$i]."\]#is",$text)) {
    19.                    $exp=explode("[".$thisbb[$i]."]",$text);
    20.                    for($z=0,$k=count($closebb[1])-count($openbb[1]);$z<$k;$z++) {
    21.                        $exp[0].="[".$thisbb[$i]."]";
    22.                    }
    23.                    $text=join("[".$thisbb[$i]."]",$exp);
    24.                }else {
    25.                    $text=str_replace("[/".$thisbb[$i]."]","[/".$thisbb[$i]."&#093",$text);
    26.                }
    27.            }
    28.         }
    29.         return $text;
    30.     }
    31. ?>
    естественно на выводе не стоит пользоваться этой функцией, на и вообще на выводе не стоит заменять бб коды,
    бб коды лучше обрабатывать при добавлении в БД
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Около года назад занимался бб-тегами.
    Скрипт скорее всего бредовый, но он учитывает атрибуты типа [SIZE] и пр. Решения тоже не очень хорошие, но все же:
    PHP:
    1.  
    2. <?php
    3.  
    4.  #Отчистка от font
    5. preg_match_all('~<font(.*?)>(.*?)</font>~is', $text, $nofont);
    6. if ($nofont[0][0] != "") {
    7. for ($i=0;$i<sizeof($nofont[1]);$i++) {
    8.   $parametr = explode(" ",$nofont[1][$i]);
    9.   for ($m=1;$m<=sizeof($parametr);$m++) {
    10.     $textbb[$i] = (!$textbb[$i]) ? $nofont[2][$i] : $textbb[$i];
    11.     if (substr($parametr[$m],0,3) == "col") {
    12.       $tag = preg_replace('~color="(.*?)"~is',"[COLOR=$1]",$parametr[$m]);
    13.       $textbb[$i] = $tag.$textbb[$i]."[/COLOR]";
    14.     }
    15.     elseif (substr($parametr[$m],0,3) == "siz") {
    16.       $tag = preg_replace('~size="(.*?)"~is',"[SIZE=$1]",$parametr[$m]);
    17.       $textbb[$i] = $tag.$textbb[$i]."[/SIZE]";
    18.     }
    19.     elseif (substr($parametr[$m],0,3) == "fam") {
    20.       $tag = preg_replace('~family="(.*?)"~is',"[FONT=$1]",$parametr[$m]);
    21.       $textbb[$i] = $tag.$textbb[$i]."[/FONT]";
    22.     }
    23.   }
    24.   $zamen = $nofont[0][$i];
    25.   $zamena[$zamen] = $textbb[$i];
    26.  }
    27.  $text = strtr($text,$zamena);
    28.  unset($zamen);
    29.  unset($zamena);
    30. }
    31.  #Чистим <img
    32. preg_match_all('~<img(.*?)>~is', $text, $noimg);
    33. if ($noimg[0][0] != "") {
    34.  for ($i=0;$i<sizeof($noimg[1]);$i++) {
    35.    $tag = preg_replace('~src="(.*?)"(.*)~is',"[img]$1[/img]",$noimg[1][$i]);
    36.    $zamen = $noimg[0][$i];
    37.    $zamena[$zamen] = $tag;
    38.  }
    39.  $text = strtr($text,$zamena);
    40.  unset($zamen);
    41.  unset($zamena);
    42. }
    43.  #Чистим <a href
    44. preg_match_all('~<a(.*?)>(.*?)</a>~is', $text, $nohref);
    45. if ($nohref[0][0] != "") {
    46.  for ($i=0;$i<sizeof($nohref[1]);$i++) {
    47.    $tag = preg_replace('~href="(.*?)"~is',"[url=$1]",$nohref[1][$i]);
    48.    $tag = $tag.$nohref[2][$i]."[/url]";
    49.    $zamen = $nohref[0][$i];
    50.    $zamena[$zamen] = trim($tag);
    51.  }
    52.  $text = strtr($text,$zamena);
    53. }
    54.  $protect = array ("<b>"=> "[b]",
    55.    "</b>"=> "[/b]",
    56.    "<U>"=> "[u]",
    57.    "</U>"=> "[/u]",
    58.    "<EM>"=> "[i]",
    59.    "</EM>"=> "[/i]",
    60.    "<center>" => "[C]",
    61.    "</center>" => "[/C]",
    62.    "<br>" => "\n"
    63.    );
    64.   global $cleartxt;
    65.   $cleartxt = strtr($text, $protect);
    66.  
    И обратное преобразование:

    PHP:
    1.  
    2. <?php
    3. #Функиция берет html - код и преобразовывает его в bb-тег
    4. function nohtml($text) {
    5. #Отчистка от font
    6. preg_match_all('~<font(.*?)>(.*?)</font>~is', $text, $nofont);
    7. for ($i=0;$i<sizeof($nofont[1]);$i++) {
    8.   $parametr = explode(" ",$nofont[1][$i]);
    9.   for ($m=1;$m<=sizeof($parametr);$m++) {
    10.     $textbb[$i] = (!$textbb[$i]) ? $nofont[2][$i] : $textbb[$i];
    11.     if (substr($parametr[$m],0,3) == "col") {
    12.       $tag = preg_replace('~color="(.*?)"~is',"[COLOR=$1]",$parametr[$m]);
    13.       $textbb[$i] = $tag.$textbb[$i]."[/COLOR]";
    14.     }
    15.     elseif (substr($parametr[$m],0,3) == "siz") {
    16.       $tag = preg_replace('~size="(.*?)"~is',"[SIZE=$1]",$parametr[$m]);
    17.       $textbb[$i] = $tag.$textbb[$i]."[/SIZE]";
    18.     }
    19.     elseif (substr($parametr[$m],0,3) == "fam") {
    20.       $tag = preg_replace('~family="(.*?)"~is',"[FONT=$1]",$parametr[$m]);
    21.       $textbb[$i] = $tag.$textbb[$i]."[/FONT]";
    22.     }
    23.   }
    24.   $zamen = $nofont[0][$i];
    25.   $zamena[$zamen] = $textbb[$i];
    26.  }
    27.  $text = strtr($text,$zamena);
    28.  unset($zamen);
    29.  unset($zamena);
    30.  #Чистим <img
    31. preg_match_all('~<img(.*?)>~is', $text, $noimg);
    32.  for ($i=0;$i<sizeof($noimg[1]);$i++) {
    33.    $tag = preg_replace('~src="(.*?)"~is',"[img]$1[/img]",$noimg[1][$i]);
    34.    $zamen = $noimg[0][$i];
    35.    $zamena[$zamen] = $tag;
    36.  }
    37.  $text = strtr($text,$zamena);
    38.  unset($zamen);
    39.  unset($zamena);
    40.  #Чистим <a href
    41. preg_match_all('~<a(.*?)>(.*?)</a>~is', $text, $nohref);
    42.  for ($i=0;$i<sizeof($nohref[1]);$i++) {
    43.    $tag = preg_replace('~href="(.*?)"~is',"[url=$1]",$nohref[1][$i]);
    44.    $tag = $tag.$nohref[2][$i]."[/url]";
    45.    $zamen = $nohref[0][$i];
    46.    $zamena[$zamen] = trim($tag);
    47.  }
    48.  #preg_replace("/^(http:\/\/[a-z]*\.ru)$/i", "<a href=\"$1\" target=\"_blank\">$1</a>", $url);
    49. $text = strtr($text,$zamena);
    50.  $protect = array ("[b]"=> "<b>",
    51.    "[/b]"=> "</b>",
    52.    "[u]"=> "<U>",
    53.    "[/u]"=> "</U>",
    54.    "[i]"=> "<EM>",
    55.    "[/i]"=> "</EM>",
    56.    "[C]" => "<center>",
    57.    "[/C]" => "</center>",
    58.    "<br>" => "\n"
    59.    );
    60.   global $cleartxt;
    61.   $cleartxt = strtr($text, $protect);
    62. }
    63. nohtml($text);
    64. ?>
    65.  
    66.  
    UPD: Вот фигня! Он повырезал bb-теги!
     
  5. amplifier

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

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    большое спасибо за ответы. Сейчас буду пробовать)
     
  6. sword dancer

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

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    php.net/bbcode
     
  7. amplifier

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

    С нами с:
    19 ноя 2008
    Сообщения:
    49
    Симпатии:
    0
    Mr.M.I.T.
     
  8. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
  9. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    классная штука. А как обратно из хтмл в ббкоды?
     
  10. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    А зачем?
     
  11. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Sergey89, ну, чтобы если вдруг что надо подправить... ну, или процитировать
     
  12. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Ну для случая "если вдруг что надо подправить" храни чистые данные с соседнем поле.
     
  13. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    А как вам такое решение:
    PHP:
    1. <?php
    2. function bbcode_quote($text)
    3. {
    4.     $parts = explode('[/quote]', $text);
    5.  
    6.     if(($closetagsnum = count($parts) - 1) > 0)
    7.     {
    8.         $opentagsnum = 0;
    9.  
    10.         for($i = 0; $i <= $closetagsnum; $i++)
    11.         {
    12.             $opentagsnum += substr_count($parts[$i], '[quote]');
    13.  
    14.             if($opentagsnum <= $closetagsnum)
    15.             {
    16.                 $parts_r[] = str_replace('[quote]', '<fieldset><legend>Цитата</legend>', $parts[$i]).'</fieldset>';
    17.             }
    18.             else
    19.             {
    20.                 $parts_r[] = $parts[$i];
    21.             }
    22.         }
    23.  
    24.         $text = implode('', $parts_r);
    25.     }
    26.  
    27.     return $text;
    28. }
    Особо не тестировал, но вроде работает.
     
  14. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной