Какая функция заменяет BBcode на HTML ?

Форум для авторов модов для phpBB 2.0.x. Здесь можно попросить помощи в разработке у коллег.

Какая функция заменяет BBcode на HTML ?

Сообщение Valtasar 07.04.2006 22:39

Я вывожу часть сообщений с форума на новостную ленту сайта.
Не разобрался какой функцией заменить теги BBcode на обычные хтмл...
насколько я понял, она должна быть в файле bbcode.php

т.е. мне нужно $text = функция($text)
также как функция для смайлов $text = smilies_pass($text);
Valtasar
phpBB 1.0.0
 
Сообщения: 4
Зарегистрирован: 07.04.2006 21:52
Откуда: Россия


Сообщение Valtasar 08.04.2006 12:24

гмм, никто не знает? :(
Valtasar
phpBB 1.0.0
 
Сообщения: 4
Зарегистрирован: 07.04.2006 21:52
Откуда: Россия

Сообщение CURANS 09.04.2006 17:43

Теги в квадратных скобках можно заменить на теги в угловых с помощью функции
Код: Выделить всё
htmlspecialchars ()
.

А теги вроде img и url, AFAIK, преобразовать можно с помощью регулярных выражений. Для [url]...[/url] что-то вроде:

Код: Выделить всё
<?php
$text = "[url = http://...] ... [/url]";
$patern = "#\[[\s]*url[\s]*=[\s]*([^\]]*)\]([^\[]*)\[[\s]*/url[s]*\]#i;
$replacment = '<a href=\\1>\\2</a>';
echo preg_replace($patern, $replacment, $text);
?>


Ну и так далее.
CURANS
phpBB 1.4.0
 
Сообщения: 39
Зарегистрирован: 26.01.2006 18:18

Сообщение Xpert 09.04.2006 19:21

http://www.phpbbguru.net/community/viewtopic.php?t=5618
В этом же разделе... чуть ниже. Я понимаю - лень - двигатель прогресса. Но не до такой же степени.
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Аватара пользователя
Xpert
phpBB Guru
 
Сообщения: 5710
Зарегистрирован: 13.03.2004 22:27
Откуда: msk.ru

Сообщение Valtasar 11.04.2006 15:03

Xpert, я видел тот топик, но не очень разобрался в изложенном там способе....
мой вопрос был в том, можно ли преобразовать BBcode в html аналогично тому как обрабатываются смайлы функцией
$text = smilies_pass($text);

мне сказали, что надо использовать функции:
prepare_bbcode_template($bbcode_tpl);
$text = bbencode_first_pass($text, $uid);
$text = bbencode_second_pass($text, $uid);

но таким образом я просто убирал BBcode, html вместо него не появлялся...,

поэтому я сделал свой неболшой обработчик тегов:
Код: Выделить всё
$bbcode = array('[b:]','[/b:]','[i:]','[/i:]','[u:]','[/u:]','[color','[size','[/color:]','[/size:]','[img:]','[/img:]','[url=','[/url]',':]',']');
$html = array('<b>','</b>','<i>','</i>','<u>','</u>','<font color','<font size','</font>','</font>','<img src="','">','<a  target=_blank href=','</a>','>','>');
$text = str_replace($msg['bbcode_uid'],'',$text); // убираем uid`ы
$text = str_replace($bbcode, $html, $text);       // меняем bbcode на html
$text = nl2br($text);


хотя таким способом неправильно заменяется тег SIZE, т.к. размеры шрифтов на форуме не совпадают с нормальными размерами html

Если все таки кто то может здесь написать правильную последовательность вызова функций из bbcode.php, буду очень признателен. :?
Valtasar
phpBB 1.0.0
 
Сообщения: 4
Зарегистрирован: 07.04.2006 21:52
Откуда: Россия

Сообщение Crow 25.04.2006 11:41

Код: Выделить всё
      if ( !$board_config['allow_html'] )
      {
         $html_on = 0;
      }
      else
      {
         $html_on = ( $submit || $refresh ) ? ( ( !empty($HTTP_POST_VARS['disable_html']) ) ? 0 : TRUE ) : ( ( $userdata['user_id'] == ANONYMOUS ) ? $board_config['allow_html'] : $userdata['user_allowhtml'] );
      }
      
      if ( !$board_config['allow_bbcode'] )
      {
         $bbcode_on = 0;
      }
      else
      {
         $bbcode_on = ( $submit || $refresh ) ? ( ( !empty($HTTP_POST_VARS['disable_bbcode']) ) ? 0 : TRUE ) : ( ( $userdata['user_id'] == ANONYMOUS ) ? $board_config['allow_bbcode'] : $userdata['user_allowbbcode'] );
      }
      
      if ( !$board_config['allow_smilies'] )
      {
         $smilies_on = 0;
      }
      else
      {
         $smilies_on = ( $submit || $refresh ) ? ( ( !empty($HTTP_POST_VARS['disable_smilies']) ) ? 0 : TRUE ) : ( ( $userdata['user_id'] == ANONYMOUS ) ? $board_config['allow_smilies'] : $userdata['user_allowsmile'] );
      }


и после него

Код: Выделить всё
         $message = stripslashes($message);
         $message = trim($message);
         if ($html_on)
         {
               $allowed_html_tags = split(',', $board_config['allow_html_tags']);
               $end_html = 0;
               $start_html = 1;
               $tmp_message = '';
               $message = ' ' . $message . ' ';
               while ($start_html = strpos($message, '<', $start_html))
               {
                     $tmp_message .= preg_replace($html_entities_match, $html_entities_replace, substr($message, $end_html + 1, ($start_html - $end_html - 1)));
                     if ($end_html = strpos($message, '>', $start_html))
                     {
                           $length = $end_html - $start_html + 1;
                           $hold_string = substr($message, $start_html, $length);
                           if (($unclosed_open = strrpos(' ' . $hold_string, '<')) != 1)
                           {
                                 $tmp_message .= preg_replace($html_entities_match, $html_entities_replace, substr($hold_string, 0, $unclosed_open - 1));
                                 $hold_string = substr($hold_string, $unclosed_open - 1);
                           }
                           $tagallowed = false;
                           for ($i = 0; $i < sizeof($allowed_html_tags); $i++)
                           {
                                 $match_tag = trim($allowed_html_tags[$i]);
                                 if (preg_match('#^<\/?' . $match_tag . '[> ]#i', $hold_string))
                                 {
                                       $tagallowed = (preg_match('#^<\/?' . $match_tag . ' .*?(style[\t ]*?=|on[\w]+[\t ]*?=)#i', $hold_string)) ? false : true;
                                 }
                           }
                           $tmp_message .= ($length && !$tagallowed) ? preg_replace($html_entities_match, $html_entities_replace, $hold_string) : $hold_string;
                           $start_html += $length;
                     }
                     else
                     {
                           $tmp_message .= preg_replace($html_entities_match, $html_entities_replace, substr($message, $start_html, strlen($message)));
                           $start_html = strlen($message);
                           $end_html = $start_html;
                     }
               }
               if (!$end_html || ($end_html != strlen($message) && $tmp_message != ''))
               {
                     $tmp_message .= preg_replace($html_entities_match, $html_entities_replace, substr($message, $end_html + 1));
               }
               $message = ($tmp_message != '') ? trim($tmp_message) : trim($message);
         }
         else
         {
               $message = preg_replace($html_entities_match, $html_entities_replace, $message);
         }
         $bbcode_uid = ($bbcode_on) ? make_bbcode_uid() : '';
         $message = trim($message);
         if($bbcode_on && $bbcode_uid != '')
         {
            $message = bbencode_first_pass($message, $bbcode_uid);
         }


Добавлено спустя 9 часов 46 минут 56 секунд:

updated

Добавлено спустя 6 минут 48 секунд:

в базу сохранять $message и $bbcode_uid


обратная обработка для вывода ббкода и смайликов в виде хтмл
Код: Выделить всё
$message = bbencode_second_pass($message, $bbcode_uid);
$message = smilies_pass($message);
$message = make_clickable($message);
$message = nl2br($message);


функции из bbcode.php и functions_post.php
Аватара пользователя
Crow
phpBB 2.0.2
 
Сообщения: 156
Зарегистрирован: 02.08.2005 14:35
Откуда: Киев

Сообщение svtol 03.05.2006 13:46

Код: Выделить всё
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
include($phpbb_root_path . 'includes/bbcode.'.$phpEx);

$message = bbencode_second_pass($post_text, $bbcode_uid);


В ответ получаю
Fatal error: Call to a member function on a non-object in w:\home\localhost\www\forum\includes\bbcode.php on line 46

Что где не так?
Объединение обманутых вклдачиков Сбербанка.
http://dcv.al.ru/
svtol
phpBB 1.2.0
 
Сообщения: 12
Зарегистрирован: 17.04.2006 19:31


Вернуться в Для авторов (phpBB 2.0.x)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0