Эта статья устарела. Предлагаемая в ней библиотека - тоже. Более совершенную версию библиотеки и документацию к ней найдете здесь
Реализовал класс на PHP для работы с BBCode. Предлагаю вашему вниманию. Он может быть использован в гостевых книгах, форумах, на досках объявлений и т.п. Данная статья целиком сверстана в BBCode и конвертирована в HTML с помощью описываемого класса.Парсер реализован несколько отлично от аналогов. Обычно такие парсеры реализуются с помощью регулярных выражений. Этот же использует метод конечных автоматов. Имеет следующий плюс: как бы ни была богата и продвинута коллекция тегов, поддерживаемая в данной реализации, скорость обработки текстов будет постоянной, так как осуществляется за фиксированное число проходов. Коллекцию тегов можно увеличивать до бесконечности, а скрипт будет выполняться одинаково быстро. Скорость его работы зависит только от величины текста и от числа тегов, используемых в конкретном тексте, но не от числа всех возможных тегов и вариантов их написания. Скрипт не парсит текст многократно для каждого тега или варианта написания тега.
Использование в программах
Класс называется bbcode, поддерживает 30 тегов, "автоматические ссылки", смайлы. Коллекция тегов легко расширяема, смайлы - тем более.
Вот пример использования этого класса в PHP-коде:
 | 
При инициализации объекта ему передается текст, содержащий BBCode. Метод get_html возвращает текст HTML, конвертированный из BBCode.
Стоит также обратить внимание на свойство syntax - массив, содержащий синтаксический разбор ББКода. Заполняется при инициализации объекта. Этот массив имеет следующую структуру:
Array
(
    ...
    [i] => Array  // [i] - целочисленный ключ начиная с 0
        (
            [type] => тип элемента: 'text', 'open', 'close' или 'open/close'
                      'text'  - элемент соответствует тексту между тегами
                      'open'  - элемент соответствует открывающему тегу
                      'close' - элемент соответствует закрывающему тегу
                      'open/close' - элемент соответствует закрытому тегу
                                     (например такому: [img="..." /])
            [str]  => строковое представление элемента: текст между тегами
                      или тег (например: '[FONT color=red size=+1]')
            [name] => имя тега. Всегда в нижнем регистре. Например: 'color'.
                      Значение [name] отсутствует для элементов типа 'text'
                      и может быть пустой строкой для элементов типа
                      'close'. В последнем случае элемент будет
                      соответствовать тегу '[/]', который будет считаться
                      закрывающим для последнего незакрытого перед ним.
            [attrib] => Array         // Это значение существует только для
                (                     // элементов типов 'open' и
                    ...               // 'open/close'
                    ...
                    [имя атрибута] => значение атрибута. Например:
                    ...               [color] => red
                                      Имя атрибута всегда в нижнем регистре.
                                      Значение атрибута может быть пустой
                                      строкой. Имя тега тоже присутствует в
                                      списке атрибутов. Это для того, чтобы
                                      можно было работать, например, с
                                      такими тегами - [color="#555555"]
                )
            [layout] => Array                 // Это значение несуществует
                (                             // для элементов типа 'text'.
                    [0] => Array              // Массив содержит пары
                        (                     // ( тип строки , строка )
                            [0] => 0          // Типы могут быть следующие:
                            [1] => [          // 0 - скобка ('[' или ']')
                        )                     // 1 - слэш '/'
                    ...                       // 2 - имя тега
                    [i] => Array              //     (например - 'FONT')
                        (                     // 3 - знак '='
                            [0] => тип строки // 4 - строка из пробельных
                            [1] => строка     //     символов
                        )                     // 5 - кавычка или апостроф,
                    ...                       //     ограничивающая значение
                                              //     атрибута
                )                             // 6 - имя атрибута
        )                                     // 7 - значение атрибута
    ...
)
 | 
Подробно ознакомиться со свойствами и методами класса bbcode вы можете по его исходному коду
 Он хорошо прокомментирован.Общие сведения о тегах
- Названия тегов и атрибутов не зависят от регистра. Например, [font=Arial size=+1], [FONT=Arial SIZE=+1] и [FoNt=Arial SiZe=+1] - равнозначны.
 - Значения атрибутов могут быть закавычены "так" и 'так', либо никак не закавычены. Следующие конструкции равнозначны: [google="BBCode"], [google='BBCode'], [google=BBCode]. Следующие конструкции НЕ равнозначны: [google="Поддержка BBCode"], [google=Поддержка BBCode]. Последний вариант будет интерпретирован скриптом как [google="Поддержка" BBCode=""].
 - Теги могут быть вложенными. Но те из них, которые создают элементы блочного типа (такие как [h1] или [table]), не могут быть вложены в строчные теги (такие как [i] или [color]). Строчные элементы закрываются, если начинается блочный.
 - Теги должны быть правильно вложены. Неправильный код "[b][i]текст[/b][/i]" будет интерпретирован скриптом как "[b][i]текст[/i][/b][/i]"
 - В данной реализации BBCode поддерживаются закрывающие теги вида [/]. Такой тег закрывает последний незакрытый тег. Например, [b]текст[/b] равнозначно [b]текст[/]. Тем не менее рекомендую пользоваться именно первой формой написания. 
 Тогда, в случае нагромождения вложенных тегов, вам будет легче ориентроваться в коде. Кроме того, первая форма написания позволяет скрипту более корректно обрабатывать пользовательские ошибки. - Поддерживается закрытие тега способом [тег /]. Например, конструкции [url name=top][/url] и [url name=top /] равнозначны.
 - В некоторых случаях можно не писать закрывающий тег. Например, тег [tr] (строка таблицы), будет автоматически закрыт, как только встретится очередной [tr] или закрывающий тег [/table]. Тег [hr] вообще не имеет закрывающего, интерпретируется скриптом как [hr/]. О поведении конкретных тегов смотрите их описания.
 - При конвертации ББКода в HTML сохраняется форматирование пробелами. Т.е. все двойные пробелы переводятся в '  ', все переводы строк заменяются на '<br />'. Однако вокруг некоторых элементов (таких как [h1]) игнорируются 1-2 перевода строк, так как эти элементы сами по себе создают дополнительные отступы. Это сделано для того, чтобы по возможности приблизить визуальное представление HTML к исходному ББкоду.
 
Список тегов
- [*] - аналог HTML-ного <li>. Может содержаться только в теге [list]. Автоматически закрывается, если начинается очередной [*] или если закрывается [list]. При конвертации переводится в <li class="bb">. Смотрите примеры в описании [list].
 - [align] - выравниване текста по левому ([align=left]) или правому ([align=right]) краю, по центру ([align=center]) или по ширине ([align=justify]). При конвертации переводится в <div align="...">. Пример: "[align=right]Текст, выровненный по правому краю.[/align]". Результат:
Текст, выровненный по правому краю.
 - [b] - аналог HTML-ного <b>. Пример: "[b]текст[/b]". Результат: "текст".
 - [caption] - аналог HTML-ного <caption> (заголовок таблицы). Может содержаться только в теге [table]. При конвертации переводится в <caption class="bb">. Смотрите пример в описании [table].
 - [code] - тег для программных кодов, кодов разметки и т.п. При конвертации переводится в <pre class="bb">. Внутри [code] игнорируются ББ-теги и смайлики, не работают "автоматические ссылки". Пример:
Результат:[code] 
// Функция - обработчик тега "code"
function code_2html($elem) {
$str = '<pre class="bb">';
foreach ($elem['val'] as $item) {
if ('item'==$item['type']) { continue; }
$str .= htmlspecialchars($item['str']);
}
$str .= '</pre>';
return $str;
}
[/code]
// Функция - обработчик тега "code" function code_2html($elem) { $str = '<pre class="bb">'; foreach ($elem['val'] as $item) { if ('item'==$item['type']) { continue; } $str .= htmlspecialchars($item['str']); } $str .= '</pre>'; return $str; } - [color] - тег для цветового выделения текста. При конвертации переводится в <font color="...">. Пример: "[color=red]текст[/color]". Результат: "текст".
 - [email] - тег для создания гиперссылки e-mail. При конвертации переводится в <a class="bb_email" href="mailto:...">...</a>. Поддерживает также атрибуты title, name и target, аналогичные соответствующим в HTML. Примеры:
Код Результат [email]dima@pc.uz[/email] dima@pc.uz [email=dima@pc.uz title="Мой ящик"]Мой ящик[/email] Мой ящик  - [font] - аналог HTML-ного <font>. Используется для установки шрифта. Поддерживает также атрибуты color и size. Примеры:
Код Результат [font=Arial]текст[/font] текст [font=Verdana color=red size=+2]текст[/font] текст  - [google] - тег для создания ссылки на Google. При конвертации переводится в <a class="bb_google" href="http://www.google.com/search?q=Запрос">. Поддерживает также атрибуты title, name и target. Пример: "[google=BBCode target=_blank]Спроси Гугл про ББКод[/google]". Результат: "Спроси Гугл про ББКод".
 - [h1] - аналог HTML-ного <h1>. При конвертации переводится в <h1 class="bb">. Поддерживает атрибут align. Пример: "[h1 align=center]текст[/h1]". Результат:
текст
 - [h2] - аналог HTML-ного <h2>. При конвертации переводится в <h2 class="bb">. Поддерживает атрибут align. Пример: "[h2 align=center]текст[/h2]". Результат:
текст
 - [h3] - аналог HTML-ного <h3>. При конвертации переводится в <h3 class="bb">. Поддерживает атрибут align. Пример: "[h3 align=center]текст[/h3]". Результат:
текст
 - [hr] - аналог HTML-ного <hr>. При конвертации переводится в <hr class="bb" />. Пример: "[hr]". Результат:
 - [i] - аналог HTML-ного <i>. Пример: "[i]текст[/i]". Результат: "текст".
 - [img] - аналог HTML-ного <img>. Поддерживает атрибуты width, height и border. Примеры:
Код Результат [img]http://www.pc.uz/files/images/pcuz_1.gif[/img] [img width=116 height=22]http://www.pc.uz/files/images/pcuz_1.gif[/img]  - [list] - тег для создания списка. Аналог HTML-ных <ul> и <ol>. При конвертации переводится в <ul class="bb"> или в <ol class="bb" type="...">. Единственный вложенный тег - [*], который в свою очередь может иметь вложенные теги. Примеры:
Код Результат Код Результат Код Результат [list] 
[*]Раз
[*]Два
[*]Три
[/list]- Раз
 - Два
 - Три
 
[list=1] 
[*]Раз
[*]Два
[*]Три
[/list]- Раз
 - Два
 - Три
 
[list=a] 
[*]Раз
[*]Два
[*]Три
[/list]- Раз
 - Два
 - Три
 
 - [nobb] - тег, внутри которого не происходит конвертации ББКода в HTML, не работают "автоматические ссылки" и не вставляются смайлы. Пример: "[nobb][b]ББКод[/b] со смайлом :)[/nobb]". Результат: "[b]ББКод[/b] со смайлом :)".
Должен предупредить, что неоднозначность во вложенности тегов может привести к неожидавшимся результатам. Например,
код
[nobb] текст1 [/nobb] текст2 [/nobb]будет интерпретирован скриптом так:
[nobb] текст1 [/nobb] текст2 [/nobb]Код
[b] текст1 [nobb] текст2 [/b] текст3 [/nobb] текст4 [/b]будет интерпретирован скриптом так:
[b] текст1 [nobb] текст2 [/nobb][/b] текст3 [/nobb] текст4 [/b] - [php] - тег, подсвечивающий код PHP. При конвертации посвеченный код вставляется в <div class="php">. Пример:
Результат:[php]<?php 
// Функция - обработчик тега "php"
function php_2html($elem) {
$str = '';
foreach ($elem['val'] as $item) {
if ('text'==$item['type']) { $str .= $item['str']; }
}
if (false !== strpos($str,'<?')) {
$str = highlight_string($str, true);
} else {
$str = '<?php '.$str.' ?>';
$str = highlight_string($str, true);
$str = str_replace('<?php ', '', $str);
$str = str_replace('<?php ', '', $str);
$str = str_replace('<font color="#0000BB">?></font>', '', $str);
}
return '<div class="php">'.$str.'</div>';
}
?>[/php]
<?php
// Функция - обработчик тега "php"
function php_2html($elem) {
$str = '';
foreach ($elem['val'] as $item) {
if ('text'==$item['type']) { $str .= $item['str']; }
}
if (false !== strpos($str,'<?')) {
$str = highlight_string($str, true);
} else {
$str = '<?php '.$str.' ?>';
$str = highlight_string($str, true);
$str = str_replace('<?php ', '', $str);
$str = str_replace('<?php ', '', $str);
$str = str_replace('<font color="#0000BB">?></font>', '', $str);
}
return '<div class="php">'.$str.'</div>';
}
?> - [quote] - Цитата. При конвертации конструкция [quote=Автор]текст[/quote] переводится в
<table width="90%" border="0" align="center" class="bb_quote">
<tr><td class="author"><b>Автор писал(а):</b></td></tr>
<tr><td class="quote">текст</td></tr></table>
Вот так это выглядит:
Автор писал(а): текст 
Автора указывать необязательно. Вы можете оформить цитаты более изощрено средствами CSS. - [s] - зачеркивание текста. Аналог HTML-ного <s>. Пример: "[s]текст[/s]". Результат: "
текст". - [size] - тег для изменения размера шрифта. При конвертации переводится в <font size="...">. Пример: "[size=6]текст[/size]". Результат: "текст".
 - [sub] - нижний индекс. Аналог HTML-ного <sub>. Пример: "[sub]текст[/sub]". Результат: "текст".
 - [sup] - верхний индекс. Аналог HTML-ного <sup>. Пример: "[sup]текст[/sup]". Результат: "текст".
 - [table] - таблица. Аналог HTML-ного <table>. При конвертации переводится в <table class="bb">. Поддерживаются атрибуты border, width, cellspacing, cellpadding и align, аналогичные HTML-ным. В [table] могут быть вложены только теги [caption] (заголовок) и [tr] (строка). Пример:
[table border=1 align=center cellspacing=0 cellpadding=5]
[caption]Заголовок[/caption]
[tr]
[th]Столбец 1
[th]Столбец 2
[tr]
[td align=center colspan=2]Строка
[/table]
Результат:
Заголовок Столбец 1 Столбец 2 Строка  - [td] - ячейка таблицы. Аналог HTML-ного <td>. Может быть вложен только в [tr]. При конвертации переводится в <td class="bb">. Поддерживаются атрибуты width, height, align, valign и colspan, аналогичные HTML-ным. Пример использования смотрите выше.
 - [th] - заголовок столбца таблицы. Аналог HTML-ного <th>. Может быть вложен только в [tr]. При конвертации переводится в <th class="bb">. Поддерживаются атрибуты width, height, align, valign и colspan, аналогичные HTML-ным. Пример использования смотрите выше.
 - [tr] - строка таблицы. Аналог HTML-ного <tr>. Может быть вложен только в [table]. Может содержать только [th] и [td]. При конвертации переводится в <tr class="bb">. Пример использования смотрите выше.
 - [tt] - стиль печатной машинки. Аналог HTML-ного <tt>. Пример: "[tt]текст[/tt]". Результат: "текст".
 - [u] - подчеркнутый текст. Аналог HTML-ного <u>. Пример: "[u]текст[/u]". Результат: "текст".
 - [url] - ссылка. Аналог HTML-ного <a>. Поддерживаются атрибуты title, name (для создания якорей) и target, аналогичные HTML-ным. Может быть использован в двух вариантах: "[url]адрес_ссылки[/url]" и "[url=адрес_ссылки]текст ссылки[/url]". Если адрес ссылки не начинается с одной из следующих строк - "http://", "https://", "ftp://", "file://", "#", "/", "?", "./" или "../", то слева к нему автоматом допишется "http://". Примеры:
Код Результат [url target=_blank]www.pc.uz[/url] www.pc.uz [url=forum.pc.uz title="Хороший форум"]Форум сайта PC.UZ[/url] Форум сайта PC.UZ 
Код [url name=this /] создаст якорь в документе. 
"Автоматические ссылки" и смайлики
Поддержка "автоматических ссылок" означает, что строки вида "http://какойто_uri", "https://какойто_uri", "ftp://какойто_uri", "www.какойто_uri" и "ящик@домен" автоматически конвертируются в соответствующие гиперссылки. Этого не происходит только для содержимого тегов [code] и [nobb].Для работы со смайликами в классе bbcode предусмотрено свойство mnemonics, которое является массивом и должно содержать пары
'мнемоника' => 'ее замена'
Например: ':)' => '<img src="ulibka.gif" alt="Улыбка" />'
Сформируйте массив замен и положите его в mnemonics. Тогда ваши смайлики будут обрабатываться. Смайлики не будут вставляться в содержимое тегов [code] и [nobb]
Пример PHP-кода, устанавливающего набор смайликов:
 | 
Условия использования и инсталляция
Скрипт распространяется бесплатно по лицензии GNU v 2. Согласно этой лицензии вы можете свободно использовать, распространять и менять этот скрипт при условии, что ваши собственные программы, использующие этот скрипт также будут распространяться по лицензии GNU.Если вас не устраивает эта публичная лицензия, обращайтесь ко мне (dima@pc.uz).
Инсталляция проста:
- Скачайте zip-архив с библиотекой.
 - Распакуйте его куда-либо на своем сайте, поддерживающим PHP.
 - Наберите в адресной строке броузера: http://ваш.сайт/ваш/путь/bbcode/test.html. Это - демонстрационная фича. - Убедитесь, что скрипт работает.
 - В ваш рабочий скрипт вставьте строчку
Готово. Можете пользоваться библиотекой.include_once 'ваш/путь/bbcode/bbcode.lib.php'; 
Успешной работы!
| Дмитрий Скоробогатов | 27.07.2006 | 
Статистика просмотров страницы:
- за прошлый месяц (Октябрь 2025) - 16;
 - за последние 3 месяца (Август 2025 - Октябрь 2025) - 25;
 - за последний год (Ноябрь 2024 - Октябрь 2025) - 71;
 
Статьи и обзоры Все статьи
            Подборка лучших бесплатных видеоуроков по программированию для детей и подростков.
        
    
            Теперь пользователи получают максимум технологий без переплат, что делает апгрейд ...
        
    
            В статье разбираем, от чего зависит скорость зарядки смартфонов и ...
        
    
            Узнайте, какие квесты в Ташкенте заинтересуют профессионалов в области IT ...