Пример написания обработчика BBcode

Дата: Апрель 11, 2009

(1) комментарий

На большенстве сайтов, в которых присутствует какое либо общение или обсуждение можно применять механизм такназываемых BB-тэгов или иначе bb-code. Эта технология позволяет людям незнающим html кода выделять свои сообщения любым цветом, вставлять картинки и ссылки в свои сообщения да и вообще уменьшает количество хранимого в базе кода. Реализацию данного механизма сегодня мы и рассмотрим.

Сначала определимся с тем, какие тэги мы будем обрабатывать. Наиболее часто применяются следующие:

1
[color][size][font][align][b][i][u][center][cut][code][sql][php][email][url][img][quote][list]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    $preg = array(
    '/(?<!\\\\)\[color(?::\w+)?=(.*?)\](.*?)\[\/color(?::\w+)?\]/si'   => "<span style=\"color:\\1\">\\2</span>",
    '/(?<!\\\\)\[size(?::\w+)?=(.*?)\](.*?)\[\/size(?::\w+)?\]/si'     => "<span style=\"font-size:\\1\">\\2</span>",
    '/(?<!\\\\)\[font(?::\w+)?=(.*?)\](.*?)\[\/font(?::\w+)?\]/si'     => "<span style=\"font-family:\\1\">\\2</span>",
    '/(?<!\\\\)\[align(?::\w+)?=(.*?)\](.*?)\[\/align(?::\w+)?\]/si'   => "<div style=\"text-align:\\1\">\\2</div>",
    '/(?<!\\\\)\[b(?::\w+)?\](.*?)\[\/b(?::\w+)?\]/si'                 => "<span style=\"font-weight:bold\">\\1</span>",
    '/(?<!\\\\)\[i(?::\w+)?\](.*?)\[\/i(?::\w+)?\]/si'                 => "<span style=\"font-style:italic\">\\1</span>",
    '/(?<!\\\\)\[u(?::\w+)?\](.*?)\[\/u(?::\w+)?\]/si'                 => "<span style=\"text-decoration:underline\">\\1</span>",
    '/(?<!\\\\)\[center(?::\w+)?\](.*?)\[\/center(?::\w+)?\]/si'       => "<div style=\"text-align:center\">\\1</div>",
    // [cut]
    '/(?<!\\\\)\[cut(?::\w+)?\](.*?)\[\/cut(?::\w+)?\]/si'             => "\\1",
    // [code] & [sql]
    '/(?<!\\\\)\[sql(?::\w+)?\](.*?)\[\/sql(?::\w+)?\]/sie'            => "highlight_sql('\\1');",
    '/(?<!\\\\)\[code(?::\w+)?\](.*?)\[\/code(?::\w+)?\]/sie'          => "highlight_code('\\1');",
    '/(?<!\\\\)\[php(?::\w+)?\](.*?)\[\/php(?::\w+)?\]/ise'            => "highlight_php('\\1');",
    // [email]
    '/(?<!\\\\)\[email(?::\w+)?\](.*?)\[\/email(?::\w+)?\]/si'         => "<a href=\"mailto:\\1\" class=\"bb-email\">\\1</a>",
    '/(?<!\\\\)\[email(?::\w+)?=(.*?)\](.*?)\[\/email(?::\w+)?\]/si'   => "<a href=\"mailto:\\1\" class=\"bb-email\">\\2</a>",
    // [url]
    '/(?<!\\\\)\[url(?::\w+)?\]www\.(.*?)\[\/url(?::\w+)?\]/si'        => "<a href=\"http://www.\\1\" target=\"_blank\" class=\"bburl\">\\1</a>",
    '/(?<!\\\\)\[url(?::\w+)?\](.*?)\[\/url(?::\w+)?\]/si'             => "<a href=\"\\1\" target=\"_blank\" class=\"bb-url\">\\1</a>",
    '/(?<!\\\\)\[url(?::\w+)?=(.*?)?\](.*?)\[\/url(?::\w+)?\]/si'      => "<a href=\"\\1\" target=\"_blank\" class=\"bb-url\">\\2</a>",
    // [img]
    '/(?<!\\\\)\[img(?::\w+)?\](.*?)\[\/img(?::\w+)?\]/si'             => "<img src=\"\\1\" alt=\"\\1\" class=\"bb-image\" />",
    '/(?<!\\\\)\[img(?::\w+)?=(.*?)x(.*?)\](.*?)\[\/img(?::\w+)?\]/si' => "<img width=\"\\1\" height=\"\\2\" src=\"\\3\" alt=\"\\3\"class=\"bb-image\" />",
    // [quote]
    '/(?<!\\\\)\[quote(?::\w+)?\](.*?)\[\/quote(?::\w+)?\]/si'         => "<div>Quote:<div class=\"bb-quote\">\\1</div></div>",
    '/(?<!\\\\)\[quote(?::\w+)?=(?:&quot;|"|\')?(.*?)["\']?(?:&quot;|"|\')?\](.*?)\[\/quote\]/si' => "<div>Quote \\1:<div class=\"bb-quote\">\\2</div></div>",
    // [list]
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\*(?::\w+)?\](.*?)(?=(?:\s*<br\s*\/?>\s*)?\[\*|(?:\s*<br\s*\/?>\s*)?\[\/?list)/si' => "\n<li class=\"bb-listitem\">\\1</li>",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list(:(?!u|o)\w+)?\](?:<br\s*\/?>)?/si'  => "\n</ul>",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list:u(:\w+)?\](?:<br\s*\/?>)?/si'       => "\n</ul>",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list:o(:\w+)?\](?:<br\s*\/?>)?/si'       => "\n</ol>",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(:(?!u|o)\w+)?\]\s*(?:<br\s*\/?>)?/si' => "\n<ul class=\"bb-list-unordered\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list:u(:\w+)?\]\s*(?:<br\s*\/?>)?/si'      => "\n<ul class=\"bb-list-unordered\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list:o(:\w+)?\]\s*(?:<br\s*\/?>)?/si'      => "\n<ol class=\"bb-list-ordered\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=1\]\s*(?:<br\s*\/?>)?/si' => "\n<ol class=\"bb-list-ordered,bb-listordered-d\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=i\]\s*(?:<br\s*\/?>)?/s'  => "\n<ol class=\"bb-list-ordered,bb-listordered-lr\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=I\]\s*(?:<br\s*\/?>)?/s'  => "\n<ol class=\"bb-list-ordered,bb-listordered-ur\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=a\]\s*(?:<br\s*\/?>)?/s'  => "\n<ol class=\"bb-list-ordered,bb-listordered-la\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=A\]\s*(?:<br\s*\/?>)?/s'  => "\n<ol class=\"bb-list-ordered,bb-listordered-ua\">",
    // escaped tags like \[b], \[color], \[url], ...
    '/\\\\(\[\/?\w+(?::\w+)*\])/'=> "\\1");

Ещё одна заметка — тэг [cut] будет обрабуть текст только в том случае если в параметр обработчика будет послана переменная $is_cut принимающее значение 1 которое мы примим по умолчанию. Думаю объяснять зачем это надо необходимости нет.

1
2
3
    if ($is_cut == 1) {$preg['/(?<!\\\\)\[cut(?::\w+)?\](.*?)\[\/cut(?::\w+)?\]/si']='';}
    $message = preg_replace(array_keys($preg), array_values($preg), $message);
    return $message;

Далее определимся с массивом для подсветки sql кода.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    $words = array('add', 'auto_increment', 'all', 'alter', 'analyze', 'and',
    'as', 'asc', 'before', 'between', 'bigint', 'binary', 'blob',
    'both', 'by', 'cascade', 'case', 'change', 'character', 'check', 'collate',
    'column', 'columns', 'constraint', 'convert', 'create', 'cross', 'current_date',
    'current_time', 'current_timestamp', 'current_user', 'database', 'databases', 'day_hour',
    'day_microsecond', 'day_minute', 'day_second', 'dec', 'decimal', 'default', 'delayed',
    'delete', 'desc', 'describe', 'distinct', 'distinctrow', 'div',
    'double', 'drop', 'dual', 'else', 'enclosed', 'escaped', 'exists',
    'explain', 'false', 'fields', 'float', 'float4', 'float8', 'for',
    'force', 'foreign', 'from', 'fulltext', 'grant', 'group', 'having',
    'high_priority', 'hour_microsecond', 'hour_minute', 'hour_second',
    'if', 'ignore', 'in', 'index', 'infile', 'inner', 'insert', 'int',
    'int1', 'int2', 'int3', 'int4', 'int8', 'integer', 'interval',
    'into', 'is', 'join', 'key', 'keys', 'kill', 'leading', 'minute_second',
    'left', 'like', 'limit', 'lines', 'load', 'localtime', 'mod',
    'localtimestamp', 'lock', 'long', 'longblob', 'longtext', 'low_priority',
    'match', 'mediumblob', 'mediumint', 'mediumtext', 'middleint', 'minute_microsecond',
    'natural', 'not', 'no_write_to_binlog', 'null', 'numeric', 'on',
    'optimize', 'option', 'optionally', 'or', 'order', 'outer',
    'outfile', 'precision', 'primary', 'privileges', 'procedure',
    'purge', 'raid0', 'read', 'real', 'references', 'regexp', 'rename',
    'replace', 'require', 'restrict', 'revoke', 'right', 'rlike',
    'second_microsecond', 'select', 'separator', 'set', 'show', 'smallint',
    'soname', 'spatial', 'sql_big_result', 'sql_calc_found_rows',
    'sql_small_result', 'ssl', 'starting', 'straight_join', 'table', 'tables',
    'terminated', 'then', 'tinyblob', 'tinyint', 'tinytext', 'text', 'to',
    'trailing', 'true', 'union', 'unique', 'unlock', 'unsigned', 'update',
    'usage', 'use', 'using', 'utc_date', 'utc_time', 'utc_timestamp',
    'values', 'varbinary', 'varcharacter', 'varchar', 'varying', 'when', 'where',
    'with', 'write', 'x509', 'xor', 'year_month', 'zerofill',
    'char');

Это ключевые слова, которые будут подсвечены.
Можно так же сделать простую подсветку php кода следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function highlight_php($str) {
    $tags_exists = true;
    $res = htmlspecialchars($str);
    $res = str_replace(array('&lt;?php', '&lt;?', '?&gt;', '-&gt;', '=&gt'), array('<?php', '<?', '?>', '->', '=>'), $res);
    if (strpos('<?', $res) === false) {
        $res = '<?php '.$res.' ?>';
        $tags_exists = false;
    }
    $res = '<div class="bb-php">'.highlight_string($res, true).'</div>';
    if (!$tags_exists) {
        $res = str_replace(array('&lt;?php', '&lt;?', '?&gt;', '<br/>'), array('', '', '', ''), $res);
    }
    return $res;
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php

class bbcode {
public function bbcode2html($message, $is_cut = 1) {
    $preg = array(
    '/(?<!\\\\)\[color(?::\w+)?=(.*?)\](.*?)\[\/color(?::\w+)?\]/si'   => "<span style=\"color:\\1\">\\2</span>",
    '/(?<!\\\\)\[size(?::\w+)?=(.*?)\](.*?)\[\/size(?::\w+)?\]/si'     => "<span style=\"font-size:\\1\">\\2</span>",
    '/(?<!\\\\)\[font(?::\w+)?=(.*?)\](.*?)\[\/font(?::\w+)?\]/si'     => "<span style=\"font-family:\\1\">\\2</span>",
    '/(?<!\\\\)\[align(?::\w+)?=(.*?)\](.*?)\[\/align(?::\w+)?\]/si'   => "<div style=\"text-align:\\1\">\\2</div>",
    '/(?<!\\\\)\[b(?::\w+)?\](.*?)\[\/b(?::\w+)?\]/si'                 => "<span style=\"font-weight:bold\">\\1</span>",
    '/(?<!\\\\)\[i(?::\w+)?\](.*?)\[\/i(?::\w+)?\]/si'                 => "<span style=\"font-style:italic\">\\1</span>",
    '/(?<!\\\\)\[u(?::\w+)?\](.*?)\[\/u(?::\w+)?\]/si'                 => "<span style=\"text-decoration:underline\">\\1</span>",
    '/(?<!\\\\)\[center(?::\w+)?\](.*?)\[\/center(?::\w+)?\]/si'       => "<div style=\"text-align:center\">\\1</div>",
    // [cut]
    '/(?<!\\\\)\[cut(?::\w+)?\](.*?)\[\/cut(?::\w+)?\]/si'             => "\\1",
    // [code] & [sql]
    '/(?<!\\\\)\[sql(?::\w+)?\](.*?)\[\/sql(?::\w+)?\]/sie'            => "highlight_sql('\\1');",
    '/(?<!\\\\)\[code(?::\w+)?\](.*?)\[\/code(?::\w+)?\]/sie'          => "highlight_code('\\1');",
    '/(?<!\\\\)\[php(?::\w+)?\](.*?)\[\/php(?::\w+)?\]/ise'            => "highlight_php('\\1');",
    // [email]
    '/(?<!\\\\)\[email(?::\w+)?\](.*?)\[\/email(?::\w+)?\]/si'         => "<a href=\"mailto:\\1\" class=\"bb-email\">\\1</a>",
    '/(?<!\\\\)\[email(?::\w+)?=(.*?)\](.*?)\[\/email(?::\w+)?\]/si'   => "<a href=\"mailto:\\1\" class=\"bb-email\">\\2</a>",
    // [url]
    '/(?<!\\\\)\[url(?::\w+)?\]www\.(.*?)\[\/url(?::\w+)?\]/si'        => "<a href=\"http://www.\\1\" target=\"_blank\" class=\"bburl\">\\1</a>",
    '/(?<!\\\\)\[url(?::\w+)?\](.*?)\[\/url(?::\w+)?\]/si'             => "<a href=\"\\1\" target=\"_blank\" class=\"bb-url\">\\1</a>",
    '/(?<!\\\\)\[url(?::\w+)?=(.*?)?\](.*?)\[\/url(?::\w+)?\]/si'      => "<a href=\"\\1\" target=\"_blank\" class=\"bb-url\">\\2</a>",
    // [img]
    '/(?<!\\\\)\[img(?::\w+)?\](.*?)\[\/img(?::\w+)?\]/si'             => "<img src=\"\\1\" alt=\"\\1\" class=\"bb-image\" />",
    '/(?<!\\\\)\[img(?::\w+)?=(.*?)x(.*?)\](.*?)\[\/img(?::\w+)?\]/si' => "<img width=\"\\1\" height=\"\\2\" src=\"\\3\" alt=\"\\3\"class=\"bb-image\" />",
    // [quote]
    '/(?<!\\\\)\[quote(?::\w+)?\](.*?)\[\/quote(?::\w+)?\]/si'         => "<div>Quote:<div class=\"bb-quote\">\\1</div></div>",
    '/(?<!\\\\)\[quote(?::\w+)?=(?:&quot;|"|\')?(.*?)["\']?(?:&quot;|"|\')?\](.*?)\[\/quote\]/si' => "<div>Quote \\1:<div class=\"bb-quote\">\\2</div></div>",
    // [list]
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\*(?::\w+)?\](.*?)(?=(?:\s*<br\s*\/?>\s*)?\[\*|(?:\s*<br\s*\/?>\s*)?\[\/?list)/si' => "\n<li class=\"bb-listitem\">\\1</li>",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list(:(?!u|o)\w+)?\](?:<br\s*\/?>)?/si'  => "\n</ul>",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list:u(:\w+)?\](?:<br\s*\/?>)?/si'       => "\n</ul>",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[\/list:o(:\w+)?\](?:<br\s*\/?>)?/si'       => "\n</ol>",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(:(?!u|o)\w+)?\]\s*(?:<br\s*\/?>)?/si' => "\n<ul class=\"bb-list-unordered\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list:u(:\w+)?\]\s*(?:<br\s*\/?>)?/si'      => "\n<ul class=\"bb-list-unordered\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list:o(:\w+)?\]\s*(?:<br\s*\/?>)?/si'      => "\n<ol class=\"bb-list-ordered\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=1\]\s*(?:<br\s*\/?>)?/si' => "\n<ol class=\"bb-list-ordered,bb-listordered-d\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=i\]\s*(?:<br\s*\/?>)?/s'  => "\n<ol class=\"bb-list-ordered,bb-listordered-lr\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=I\]\s*(?:<br\s*\/?>)?/s'  => "\n<ol class=\"bb-list-ordered,bb-listordered-ur\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=a\]\s*(?:<br\s*\/?>)?/s'  => "\n<ol class=\"bb-list-ordered,bb-listordered-la\">",
    '/(?<!\\\\)(?:\s*<br\s*\/?>\s*)?\[list(?::o)?(:\w+)?=A\]\s*(?:<br\s*\/?>)?/s'  => "\n<ol class=\"bb-list-ordered,bb-listordered-ua\">",
    // escaped tags like \[b], \[color], \[url], ...
    '/\\\\(\[\/?\w+(?::\w+)*\])/'=> "\\1");
    if ($is_cut == 1) {$preg['/(?<!\\\\)\[cut(?::\w+)?\](.*?)\[\/cut(?::\w+)?\]/si']='';}
    $message = preg_replace(array_keys($preg), array_values($preg), $message);
    return $message;
}

public function highlight_php($str) {
    $tags_exists = true;
    $res = htmlspecialchars($str);
    $res = str_replace(array('&lt;?php', '&lt;?', '?&gt;', '-&gt;', '=&gt'), array('<?php', '<?', '?>', '->', '=>'), $res);
    if (strpos('<?', $res) === false) {
        $res = '<?php '.$res.' ?>';
        $tags_exists = false;
    }
    $res = '<div class="bb-php">'.highlight_string($res, true).'</div>';
    if (!$tags_exists) {
        $res = str_replace(array('&lt;?php', '&lt;?', '?&gt;', '<br/>'), array('', '', '', ''), $res);
    }
    return $res;
}

public function highlight_code($str) {
    $res = '<div class="bb-code">'.htmlspecialchars($str).'</div>';
    return $res;
}

public function highlight_sql($str) {
    $words = array('add', 'auto_increment', 'all', 'alter', 'analyze', 'and',
    'as', 'asc', 'before', 'between', 'bigint', 'binary', 'blob',
    'both', 'by', 'cascade', 'case', 'change', 'character', 'check', 'collate',
    'column', 'columns', 'constraint', 'convert', 'create', 'cross', 'current_date',
    'current_time', 'current_timestamp', 'current_user', 'database', 'databases', 'day_hour',
    'day_microsecond', 'day_minute', 'day_second', 'dec', 'decimal', 'default', 'delayed',
    'delete', 'desc', 'describe', 'distinct', 'distinctrow', 'div',
    'double', 'drop', 'dual', 'else', 'enclosed', 'escaped', 'exists',
    'explain', 'false', 'fields', 'float', 'float4', 'float8', 'for',
    'force', 'foreign', 'from', 'fulltext', 'grant', 'group', 'having',
    'high_priority', 'hour_microsecond', 'hour_minute', 'hour_second',
    'if', 'ignore', 'in', 'index', 'infile', 'inner', 'insert', 'int',
    'int1', 'int2', 'int3', 'int4', 'int8', 'integer', 'interval',
    'into', 'is', 'join', 'key', 'keys', 'kill', 'leading', 'minute_second',
    'left', 'like', 'limit', 'lines', 'load', 'localtime', 'mod',
    'localtimestamp', 'lock', 'long', 'longblob', 'longtext', 'low_priority',
    'match', 'mediumblob', 'mediumint', 'mediumtext', 'middleint', 'minute_microsecond',
    'natural', 'not', 'no_write_to_binlog', 'null', 'numeric', 'on',
    'optimize', 'option', 'optionally', 'or', 'order', 'outer',
    'outfile', 'precision', 'primary', 'privileges', 'procedure',
    'purge', 'raid0', 'read', 'real', 'references', 'regexp', 'rename',
    'replace', 'require', 'restrict', 'revoke', 'right', 'rlike',
    'second_microsecond', 'select', 'separator', 'set', 'show', 'smallint',
    'soname', 'spatial', 'sql_big_result', 'sql_calc_found_rows',
    'sql_small_result', 'ssl', 'starting', 'straight_join', 'table', 'tables',
    'terminated', 'then', 'tinyblob', 'tinyint', 'tinytext', 'text', 'to',
    'trailing', 'true', 'union', 'unique', 'unlock', 'unsigned', 'update',
    'usage', 'use', 'using', 'utc_date', 'utc_time', 'utc_timestamp',
    'values', 'varbinary', 'varcharacter', 'varchar', 'varying', 'when', 'where',
    'with', 'write', 'x509', 'xor', 'year_month', 'zerofill',
    'char');

    foreach ($words as $word) {
        $patterns[] = '/\b'.$word.'\b/i';
        $WORDS[] = '<span class="bb-sql-word">'.strtoupper($word).'</span>';
    }

    $res = '<div class="bb-sql">'.preg_replace($patterns, $WORDS, $str).'</div>';
    return $res;
    }
}

Использовать данный класс можно следующим образом:
иницируем: $bbcode = new bbcode;
возвращаем обработанный текст в переменную с обреской [cut]: $text =$bbcode->bbcode2html($text,0);
возвращаем обработанный текст в переменную без обрезки [cut]: $text =$bbcode->bbcode2html($text,1);
Всё предельно просто

a

    Автор: Sergey




    Один комментарий на "Пример написания обработчика BBcode"

    Роман сказал:
    15.08.2010

    Спасибо за статью, как раз пишу сайт хочу бб кода влепить в комменты :)

    Продолжение дискуссии на форуме: link


    Вы можете продолжить обсуждение этой статьи на форуме


    Имя : 
    Почта : 
    Сайт : 
    Комментарий : 

    Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.

    Создание сайта - Echo-group Раскрутка сайтов