[h1 align=center]Парсер BBCode на PHP[/h1] [i]Реализовал класс на PHP для работы с BBCode. Предлагаю вашему вниманию. Он может быть использован в гостевых книгах, форумах, на досках объявлений и т.п. Данная статья целиком сверстана в BBCode и конвертирована в HTML с помощью описываемого класса.[/i] Парсер реализован несколько отлично от аналогов. Обычно такие парсеры реализуются с помощью регулярных выражений. Этот же использует метод конечных автоматов. Имеет следующий плюс: [u]как бы ни была богата и продвинута коллекция тегов, поддерживаемая в данной реализации, скорость обработки текстов будет постоянной[/u], так как осуществляется за фиксированное число проходов. Коллекцию тегов можно увеличивать до бесконечности, а скрипт будет выполняться одинаково быстро. Скорость его работы зависит только от величины текста и от числа тегов, используемых в конкретном тексте, но не от числа всех возможных тегов и вариантов их написания. Скрипт не парсит текст многократно для каждого тега или варианта написания тега. [h2 align=center]Использование в программах[/h2] Класс называется [b][tt]bbcode[/tt][/b], поддерживает 30 тегов, "автоматические ссылки", смайлы. Коллекция тегов легко расширяема, смайлы - тем более. :) Вот пример использования этого класса в PHP-коде: [table border=0 align=center][tr][td][php] $text = '[b]Переменная с текстом BBCode: [i]Hello world![/i][/b]'; // Подключаем библиотеку с классом include_once 'bbcode.lib.php'; // Создаем объект и распарсиваем $text $bb = new bbcode($text); // Конвертируем BBCode в HTML и выводим его echo $bb -> get_html();[/php][/table] Все достаточно просто. При инициализации объекта ему передается текст, содержащий BBCode. Метод [tt][b]get_html[/b][/tt] возвращает текст HTML, конвертированный из BBCode. Стоит также обратить внимание на свойство [tt][b]syntax[/b][/tt] - массив, содержащий синтаксический разбор ББКода. Заполняется при инициализации объекта. Этот массив имеет следующую структуру: [table border=0 align=center][tr][td][code] 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 - значение атрибута ... )[/code][/table] Свойство [tt][b]syntax[/b][/tt] может помочь вам организовать подсветку ББКода или просто вырезать все теги из текста. Подробно ознакомиться со свойствами и методами класса [b][tt]bbcode[/tt][/b] вы можете по его исходному коду :D Он хорошо прокомментирован. [h2 align=center]Общие сведения о тегах[/h2] [list=a] [*]Названия тегов и атрибутов не зависят от регистра. Например, [tt][color=blue][nobb][font=Arial size=+1][/nobb][/color][/tt], [tt][color=blue][nobb][FONT=Arial SIZE=+1][/nobb][/color][/tt] и [tt][color=blue][nobb][FoNt=Arial SiZe=+1][/nobb][/color][/tt] - равнозначны. [*]Значения атрибутов могут быть закавычены "так" и 'так', либо никак не закавычены. Следующие конструкции равнозначны: [tt][color=blue][nobb][google="BBCode"][/nobb][/color][/tt], [tt][color=blue][nobb][google='BBCode'][/nobb][/color][/tt], [tt][color=blue][nobb][google=BBCode][/nobb][/color][/tt]. Следующие конструкции НЕ равнозначны: [tt][color=blue][nobb][google="Поддержка BBCode"][/nobb][/color][/tt], [tt][color=blue][nobb][google=Поддержка BBCode][/nobb][/color][/tt]. Последний вариант будет интерпретирован скриптом как [tt][color=blue][nobb][google="Поддержка" BBCode=""][/nobb][/color][/tt]. [*]Теги могут быть вложенными. Но те из них, которые создают элементы блочного типа (такие как [tt][color=blue][nobb][h1][/nobb][/color][/tt] или [tt][color=blue][nobb][table][/nobb][/color][/tt]), не могут быть вложены в строчные теги (такие как [tt][color=blue][nobb][i][/nobb][/color][/tt] или [tt][color=blue][nobb][color][/nobb][/color][/tt]). Строчные элементы закрываются, если начинается блочный. [*]Теги должны быть правильно вложены. Неправильный код "[tt][color=blue][nobb][b][i][/nobb][/color]текст[color=blue][nobb][/b][/i][/nobb][/color][/tt]" будет интерпретирован скриптом как "[tt][color=blue][nobb][b][i][/nobb][/color]текст[color=blue][nobb][/i][/b][/nobb][/color][nobb][/i][/nobb][/tt]" [*]В данной реализации BBCode поддерживаются закрывающие теги вида [color=blue][tt][[/tt][tt]/][/tt][/color]. Такой тег закрывает последний незакрытый тег. Например, [tt][color=blue][nobb][b]текст[/b][/nobb][/color][/tt] равнозначно [tt][color=blue][nobb][b]текст[/][/nobb][/color][/tt]. Тем не менее рекомендую пользоваться именно первой формой написания. :vip: Тогда, в случае нагромождения вложенных тегов, вам будет легче ориентроваться в коде. Кроме того, первая форма написания позволяет скрипту более корректно обрабатывать пользовательские ошибки. [*]Поддерживается закрытие тега способом [tt][color=blue][тег /][/color][/tt]. Например, конструкции [tt][color=blue][nobb][url name=top][/url][/nobb][/color][/tt] и [tt][color=blue][nobb][url name=top /][/nobb][/color][/tt] равнозначны. [*]В некоторых случаях можно не писать закрывающий тег. Например, тег [tt][color=blue][nobb][tr][/nobb][/color][/tt] (строка таблицы), будет автоматически закрыт, как только встретится очередной [tt][color=blue][nobb][tr][/nobb][/color][/tt] или закрывающий тег [tt][color=blue][/table][/color][/tt]. Тег [tt][color=blue][nobb][hr][/nobb][/color][/tt] вообще не имеет закрывающего, интерпретируется скриптом как [tt][color=blue][nobb][hr/][/nobb][/color][/tt]. О поведении конкретных тегов смотрите их описания. [*]При конвертации ББКода в HTML сохраняется форматирование пробелами. Т.е. все двойные пробелы переводятся в [tt]' '[/tt], все переводы строк заменяются на [tt]'<br />'[/tt]. Однако вокруг некоторых элементов (таких как [tt][color=blue][nobb][h1][/nobb][/color][/tt]) игнорируются 1-2 перевода строк, так как эти элементы сами по себе создают дополнительные отступы. Это сделано для того, чтобы по возможности приблизить визуальное представление HTML к исходному ББкоду. [/list] [h2 align=center]Список тегов[/h2] [list=1] [*][b][nobb][*][/nobb][/b] - аналог HTML-ного [tt]<li>[/tt]. Может содержаться только в теге [tt][color=blue][nobb][list][/nobb][/color][/tt]. Автоматически закрывается, если начинается очередной [tt][color=blue][nobb][*][/nobb][/color][/tt] или если закрывается [tt][color=blue][nobb][list][/nobb][/color][/tt]. При конвертации переводится в [tt]<li class="bb">[/tt]. Смотрите примеры в описании [tt][color=blue][nobb][list][/nobb][/color][/tt]. [*][b][nobb][align][/nobb][/b] - выравниване текста по левому ([tt][color=blue][nobb][align=left][/nobb][/color][/tt]) или правому ([tt][color=blue][nobb][align=right][/nobb][/color][/tt]) краю, по центру ([tt][color=blue][nobb][align=center][/nobb][/color][/tt]) или по ширине ([tt][color=blue][nobb][align=justify][/nobb][/color][/tt]). При конвертации переводится в [tt]<div align="...">[/tt]. Пример: "[tt][color=blue][nobb][align=right][/nobb][/color]Текст, выровненный по правому краю.[color=blue][nobb][/align][/nobb][/color][/tt]". Результат: [align=right]Текст, выровненный по правому краю.[/align] [*][b][nobb][b][/nobb][/b] - аналог HTML-ного [tt]<b>[/tt]. Пример: "[tt][color=blue][nobb][b][/nobb][/color]текст[color=blue][nobb][/b][/nobb][/color][/tt]". Результат: "[b]текст[/b]". [*][b][nobb][caption][/nobb][/b] - аналог HTML-ного [tt]<caption>[/tt] (заголовок таблицы). Может содержаться только в теге [tt][color=blue][nobb][table][/nobb][/color][/tt]. При конвертации переводится в [tt]<caption class="bb">[/tt]. Смотрите пример в описании [tt][color=blue][nobb][table][/nobb][/color][/tt]. [*][b][nobb][code][/nobb][/b] - тег для программных кодов, кодов разметки и т.п. При конвертации переводится в [tt]<pre class="bb">[/tt]. Внутри [tt][color=blue][nobb][code][/nobb][/color][/tt] игнорируются ББ-теги и смайлики, не работают "автоматические ссылки". Пример: [table border=0 align=center][tr][td][tt][color=blue][nobb][code][/nobb][/color] // Функция - обработчик тега "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=blue][nobb][/code][/nobb][/color][/tt][/table] Результат: [table border=0 align=center][tr][td][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][/table] [*][b][nobb][color][/nobb][/b] - тег для цветового выделения текста. При конвертации переводится в [tt]<font color="...">[/tt]. Пример: "[tt][color=blue][nobb][color=red][/nobb][/color]текст[color=blue][/[nobb]color][/nobb][/color][/tt]". Результат: "[color=red]текст[/color]". [*][b][nobb][email][/nobb][/b] - тег для создания гиперссылки e-mail. При конвертации переводится в [tt]<a class="bb_email" href="mailto:...">...</a>[/tt]. Поддерживает также атрибуты [tt][color=blue]title[/color][/tt], [tt][color=blue]name[/color][/tt] и [tt][color=blue]target[/color][/tt], аналогичные соответствующим в HTML. Примеры: [table border=1 align=center cellspacing=0 cellpadding=5] [tr] [th]Код [th]Результат [tr] [td][tt][color=blue][nobb][email][/nobb][/color][nobb]dima@pc.uz[/nobb][color=blue][nobb][/email][/nobb][/color][/tt] [td][email]dima@pc.uz[/email] [tr] [td][tt][color=blue][nobb][email=dima@pc.uz title="Мой ящик"][/nobb][/color]Мой ящик[color=blue][nobb][/email][/nobb][/color][/tt] [td][email=dima@pc.uz title="Мой ящик"]Мой ящик[/email] [/table] [*][b][nobb][font][/nobb][/b] - аналог HTML-ного [tt]<font>[/tt]. Используется для установки шрифта. Поддерживает также атрибуты [tt][color=blue]color[/color][/tt] и [tt][color=blue]size[/color][/tt]. Примеры: [table border=1 align=center cellspacing=0 cellpadding=5] [tr] [th]Код [th]Результат [tr] [td][tt][color=blue][nobb][font=Arial][/nobb][/color][nobb]текст[/nobb][color=blue][nobb][/font][/nobb][/color][/tt] [td][font=Arial]текст[/font] [tr] [td][tt][color=blue][nobb][font=Verdana color=red size=+2][/nobb][/color]текст[color=blue][nobb][/font][/nobb][/color][/tt] [td][font=Verdana color=red size=+2]текст[/font] [/table] [*][b][nobb][google][/nobb][/b] - тег для создания ссылки на Google. При конвертации переводится в [tt][nobb]<a class="bb_google" href="http://www.google.com/search?q=Запрос">[/nobb][/tt]. Поддерживает также атрибуты [tt][color=blue]title[/color][/tt], [tt][color=blue]name[/color][/tt] и [tt][color=blue]target[/color][/tt]. Пример: "[tt][color=blue][nobb][google=BBCode target=_blank][/nobb][/color]Спроси Гугл про ББКод[color=blue][nobb][/google][/nobb][/color][/tt]". Результат: "[google=BBCode target=_blank]Спроси Гугл про ББКод[/google]". [*][b][nobb][h1][/nobb][/b] - аналог HTML-ного [tt]<h1>[/tt]. При конвертации переводится в [tt][nobb]<h1 class="bb">[/nobb][/tt]. Поддерживает атрибут [tt][color=blue]align[/color][/tt]. Пример: "[tt][color=blue][nobb][h1 align=center][/nobb][/color]текст[color=blue][nobb][/h1][/nobb][/color][/tt]". Результат: [h1 align=center]текст[/h1] [*][b][nobb][h2][/nobb][/b] - аналог HTML-ного [tt]<h2>[/tt]. При конвертации переводится в [tt][nobb]<h2 class="bb">[/nobb][/tt]. Поддерживает атрибут [tt][color=blue]align[/color][/tt]. Пример: "[tt][color=blue][nobb][h2 align=center][/nobb][/color]текст[color=blue][nobb][/h2][/nobb][/color][/tt]". Результат: [h2 align=center]текст[/h2] [*][b][nobb][h3][/nobb][/b] - аналог HTML-ного [tt]<h3>[/tt]. При конвертации переводится в [tt][nobb]<h3 class="bb">[/nobb][/tt]. Поддерживает атрибут [tt][color=blue]align[/color][/tt]. Пример: "[tt][color=blue][nobb][h3 align=center][/nobb][/color]текст[color=blue][nobb][/h3][/nobb][/color][/tt]". Результат: [h3 align=center]текст[/h3] [*][b][nobb][hr][/nobb][/b] - аналог HTML-ного [tt]<hr>[/tt]. При конвертации переводится в [tt][nobb]<hr class="bb" />[/nobb][/tt]. Пример: "[tt][color=blue][nobb][hr][/nobb][/color][/tt]". Результат: [hr] [*][b][nobb][i][/nobb][/b] - аналог HTML-ного [tt]<i>[/tt]. Пример: "[tt][color=blue][nobb][i][/nobb][/color]текст[color=blue][nobb][/i][/nobb][/color][/tt]". Результат: "[i]текст[/i]". [*][b][nobb][img][/nobb][/b] - аналог HTML-ного [tt]<img>[/tt]. Поддерживает атрибуты [tt][color=blue]width[/color][/tt], [tt][color=blue]height[/color][/tt] и [tt][color=blue]border[/color][/tt]. Примеры: [table border=1 align=center cellspacing=0 cellpadding=5] [tr] [th]Код [th]Результат [tr] [td][tt][color=blue][nobb][img][/nobb][/color][nobb]http://www.pc.uz/files/images/pcuz_1.gif[/nobb][color=blue][nobb][/img][/nobb][/color][/tt] [td][img]http://www.pc.uz/files/images/pcuz_1.gif[/img] [tr] [td][tt][color=blue][nobb][img width=116 height=22][/nobb][/color][nobb]http://www.pc.uz/files/images/pcuz_1.gif[/nobb][color=blue][nobb][/img][/nobb][/color][/tt] [td][img width=116 height=22]http://www.pc.uz/files/images/pcuz_1.gif[/img] [/table] [*][b][nobb][list][/nobb][/b] - тег для создания списка. Аналог HTML-ных [tt]<ul>[/tt] и [tt]<ol>[/tt]. При конвертации переводится в [tt]<ul class="bb">[/tt] или в [tt]<ol class="bb" type="...">[/tt]. Единственный вложенный тег - [tt][color=blue][nobb][*][/nobb][/color][/tt], который в свою очередь может иметь вложенные теги. Примеры: [table border=1 align=center cellspacing=0 cellpadding=5] [tr] [th]Код [th]Результат [th]Код [th]Результат [th]Код [th]Результат [tr] [td][tt][color=blue][nobb][list][/nobb][/color] [color=blue][nobb][*][/nobb][/color]Раз [color=blue][nobb][*][/nobb][/color]Два [color=blue][nobb][*][/nobb][/color]Три [color=blue][/[/color][color=blue]list][/color][/tt] [td][list] [*]Раз [*]Два [*]Три [/list] [td][tt][color=blue][nobb][list=1][/nobb][/color] [color=blue][nobb][*][/nobb][/color]Раз [color=blue][nobb][*][/nobb][/color]Два [color=blue][nobb][*][/nobb][/color]Три [color=blue][/[/color][color=blue]list][/color][/tt] [td][list=1] [*]Раз [*]Два [*]Три [/list] [td][tt][color=blue][nobb][list=a][/nobb][/color] [color=blue][nobb][*][/nobb][/color]Раз [color=blue][nobb][*][/nobb][/color]Два [color=blue][nobb][*][/nobb][/color]Три [color=blue][/[/color][color=blue]list][/color][/tt] [td][list=a] [*]Раз [*]Два [*]Три [/list] [/table] [*][b][[/b][b]nobb][/b] - тег, внутри которого не происходит конвертации ББКода в HTML, не работают "автоматические ссылки" и не вставляются смайлы. Пример: "[tt][color=blue][[/color][color=blue]nobb][/color][nobb][b]ББКод[/b] со смайлом :)[/nobb][color=blue][[/color][color=blue]/nobb][/color][/tt]". Результат: "[nobb][b]ББКод[/b] со смайлом :)[/nobb]". Должен предупредить, что неоднозначность во вложенности тегов может привести к неожидавшимся результатам. Например, код [align=center][tt][color=blue][[/color][color=blue]nobb][/color] текст1 [[/tt][tt]/nobb] текст2 [color=blue][[/color][color=blue]/nobb][/color][/tt][/align] будет интерпретирован скриптом так: [align=center][tt][color=blue][[/color][color=blue]nobb][/color] текст1 [color=blue][[/color][color=blue]/nobb][/color] текст2 [[/tt][tt]/nobb][/tt][/align] Код [align=center][tt][color=blue][[/color][color=blue]b][/color] текст1 [color=blue][[/color][color=blue]nobb][/color] текст2 [[/tt][tt]/b] текст3 [color=blue][[/color][color=blue]/nobb][/color] текст4 [color=blue][[/color][color=blue]/b][/color][/tt][/align] будет интерпретирован скриптом так: [align=center][tt][color=blue][[/color][color=blue]b][/color] текст1 [color=blue][[/color][color=blue]nobb][/color] текст2 [color=blue][[/color][color=blue]/nobb][/color][color=blue][[/color][color=blue]/b][/color] текст3 [[/tt][tt]/nobb] текст4 [[/tt][tt]/b][/tt][/align] [*][b][[/b][b]php][/b] - тег, подсвечивающий код PHP. При конвертации посвеченный код вставляется в [tt]<div class="php">[/tt]. Пример: [table border=0 align=center][tr][td][tt][color=blue][nobb][php][/nobb][/color]<?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>'; } ?>[color=blue][nobb][/php][/nobb][/color][/tt][/table] Результат: [table border=0 align=center][tr][td][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][/table] [*][b][[/b][b]quote][/b] - Цитата. При конвертации конструкция [tt][color=blue][nobb][quote=Автор][/nobb][/color]текст[color=blue][nobb][/quote][/nobb][/color][/tt] переводится в [tt]<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>[/tt] Вот так это выглядит: [quote=Автор]текст[/quote] Автора указывать необязательно. Вы можете оформить цитаты более изощрено средствами CSS. [*][b][[/b][b]s][/b] - зачеркивание текста. Аналог HTML-ного [tt]<s>[/tt]. Пример: "[tt][color=blue][nobb][s][/nobb][/color]текст[color=blue][nobb][/s][/nobb][/color][/tt]". Результат: "[s]текст[/s]". [*][b][[/b][b]size][/b] - тег для изменения размера шрифта. При конвертации переводится в [tt]<font size="...">[/tt]. Пример: "[tt][color=blue][nobb][size=6][/nobb][/color]текст[color=blue][nobb][/size][/nobb][/color][/tt]". Результат: "[size=6]текст[/size]". [*][b][[/b][b]sub][/b] - нижний индекс. Аналог HTML-ного [tt]<sub>[/tt]. Пример: "[tt][color=blue][nobb][sub][/nobb][/color]текст[color=blue][nobb][/sub][/nobb][/color][/tt]". Результат: "[sub]текст[/sub]". [*][b][[/b][b]sup][/b] - верхний индекс. Аналог HTML-ного [tt]<sup>[/tt]. Пример: "[tt][color=blue][nobb][sup][/nobb][/color]текст[color=blue][nobb][/sup][/nobb][/color][/tt]". Результат: "[sup]текст[/sup]". [*][b][[/b][b]table][/b] - таблица. Аналог HTML-ного [tt]<table>[/tt]. При конвертации переводится в [tt]<table class="bb">[/tt]. Поддерживаются атрибуты [tt][color=blue]border[/color][/tt], [tt][color=blue]width[/color][/tt], [tt][color=blue]cellspacing[/color][/tt], [tt][color=blue]cellpadding[/color][/tt] и [tt][color=blue]align[/color][/tt], аналогичные HTML-ным. В [tt][color=blue][nobb][table][/nobb][/color][/tt] могут быть вложены только теги [tt][color=blue][nobb][caption][/nobb][/color][/tt] (заголовок) и [tt][color=blue][nobb][tr][/nobb][/color][/tt] (строка). Пример: [tt][color=blue][nobb][table border=1 align=center cellspacing=0 cellpadding=5] [caption][/nobb][/color]Заголовок[color=blue][nobb][/caption] [tr] [th][/nobb][/color]Столбец 1 [color=blue][nobb][th][/nobb][/color]Столбец 2 [color=blue][nobb][tr] [td align=center colspan=2][/nobb][/color]Строка [color=blue][nobb][/table][/nobb][/color][/tt] Результат: [table border=1 align=center cellspacing=0 cellpadding=5] [caption]Заголовок[/caption] [tr] [th]Столбец 1 [th]Столбец 2 [tr] [td align=center colspan=2]Строка [/table] [*][b][[/b][b]td][/b] - ячейка таблицы. Аналог HTML-ного [tt]<td>[/tt]. Может быть вложен только в [tt][color=blue][nobb][tr][/nobb][/color][/tt]. При конвертации переводится в [tt]<td class="bb">[/tt]. Поддерживаются атрибуты [tt][color=blue]width[/color][/tt], [tt][color=blue]height[/color][/tt], [tt][color=blue]align[/color][/tt], [tt][color=blue]valign[/color][/tt] и [tt][color=blue]colspan[/color][/tt], аналогичные HTML-ным. Пример использования смотрите выше. [*][b][[/b][b]th][/b] - заголовок столбца таблицы. Аналог HTML-ного [tt]<th>[/tt]. Может быть вложен только в [tt][color=blue][nobb][tr][/nobb][/color][/tt]. При конвертации переводится в [tt]<th class="bb">[/tt]. Поддерживаются атрибуты [tt][color=blue]width[/color][/tt], [tt][color=blue]height[/color][/tt], [tt][color=blue]align[/color][/tt], [tt][color=blue]valign[/color][/tt] и [tt][color=blue]colspan[/color][/tt], аналогичные HTML-ным. Пример использования смотрите выше. [*][b][[/b][b]tr][/b] - строка таблицы. Аналог HTML-ного [tt]<tr>[/tt]. Может быть вложен только в [tt][color=blue][nobb][table][/nobb][/color][/tt]. Может содержать только [tt][color=blue][nobb][th][/nobb][/color][/tt] и [tt][color=blue][nobb][td][/nobb][/color][/tt]. При конвертации переводится в [tt]<tr class="bb">[/tt]. Пример использования смотрите выше. [*][b][[/b][b]tt][/b] - стиль печатной машинки. Аналог HTML-ного [tt]<tt>[/tt]. Пример: "[tt][color=blue][nobb][tt][/nobb][/color]текст[color=blue][[/color][color=blue]/tt][/color][/tt]". Результат: "[tt]текст[/tt]". [*][b][[/b][b]u][/b] - подчеркнутый текст. Аналог HTML-ного [tt]<u>[/tt]. Пример: "[tt][color=blue][nobb][u][/nobb][/color]текст[color=blue][[/color][color=blue]/u][/color][/tt]". Результат: "[u]текст[/u]". [*][b][[/b][b]url][/b] - ссылка. Аналог HTML-ного [tt]<a>[/tt]. Поддерживаются атрибуты [tt][color=blue]title[/color][/tt], [tt][color=blue]name[/color][/tt] (для создания якорей) и [tt][color=blue]target[/color][/tt], аналогичные HTML-ным. Может быть использован в двух вариантах: "[tt][color=blue][nobb][url][/nobb][/color]адрес_ссылки[color=blue][[/color][color=blue]/url][/color][/tt]" и "[tt][color=blue][nobb][url=адрес_ссылки][/nobb][/color]текст ссылки[color=blue][[/color][color=blue]/url][/color][/tt]". Если адрес ссылки не начинается с одной из следующих строк - [tt]"http://"[/tt], [tt]"https://"[/tt], [tt]"ftp://"[/tt], [tt]"file://"[/tt], [tt]"#"[/tt], [tt]"/"[/tt], [tt]"?"[/tt], [tt]"./"[/tt] или [tt]"../"[/tt], то слева к нему автоматом допишется [tt]"http://"[/tt]. Примеры: [table border=1 align=center cellspacing=0 cellpadding=5] [tr] [th]Код [th]Результат [tr] [td][tt][color=blue][nobb][url target=_blank][/nobb][/color][nobb]www.pc.uz[/nobb][color=blue][[/color][color=blue]/url][/color][/tt] [td][url target=_blank]www.pc.uz[/url] [tr] [td][tt][color=blue][nobb][url=forum.pc.uz title="Хороший форум"][/nobb][/color]Форум сайта PC.UZ[color=blue][[/color][color=blue]/url][/color][/tt] [td][url=forum.pc.uz title="Хороший форум"]Форум сайта PC.UZ[/url] [/table] Код [tt][color=blue][nobb][url name=this /][/nobb][/color][/tt] создаст якорь в документе. [/list] [h2 align=center]"Автоматические ссылки" и смайлики[/h2] Поддержка "автоматических ссылок" означает, что строки вида [nobb]"http://какойто_uri", "https://какойто_uri", "ftp://какойто_uri", "www.какойто_uri" и "ящик@домен"[/nobb] автоматически конвертируются в соответствующие гиперссылки. Этого не происходит только для содержимого тегов [tt][color=blue][nobb][code][/nobb][/color][/tt] и [color=blue][tt][no[/tt][tt]bb][/tt][/color]. Для работы со смайликами в классе [b][tt]bbcode[/tt][/b] предусмотрено свойство [b][tt]mnemonics[/tt][/b], которое является массивом и должно содержать пары [align=center][tt]'мнемоника' => 'ее замена'[/tt][/align] Например: [tt][nobb]':)'[/nobb] => '<img src="ulibka.gif" alt="Улыбка" />'[/tt] Сформируйте массив замен и положите его в [b][tt]mnemonics[/tt][/b]. Тогда ваши смайлики будут обрабатываться. Смайлики не будут вставляться в содержимое тегов [tt][color=blue][nobb][code][/nobb][/color][/tt] и [color=blue][tt][no[/tt][tt]bb][/tt][/color] Пример PHP-кода, устанавливающего набор смайликов: [table border=0 align=center][tr][td][php] $text = 'Переменная [b]BBCode[/b] со смайликами: :) :D'; // Формируем список смайликов: $smiles = array( ':)' => '<img src="smilies/2.gif" alt="Well" />', ':D' => '<img src="smilies/1.gif" alt="Very we!" />' ) // Подключаем библиотеку с классом include_once 'bbcode.lib.php'; // Создаем объект и распарсиваем $text $bb = new bbcode($text); // Задаем набор смайликов $bb -> mnemonics = $smiles; // Конвертируем BBCode в HTML и выводим его echo $bb -> get_html();[/php][/table] [h2 align=center]Условия использования и инсталляция[/h2] Скрипт распространяется бесплатно по лицензии GNU v 2. Согласно этой лицензии вы можете свободно использовать, распространять и менять этот скрипт при условии, что ваши собственные программы, использующие этот скрипт также будут распространяться по лицензии GNU. Если вас не устраивает эта публичная лицензия, обращайтесь ко мне (dima@pc.uz). Инсталляция проста: [list] [*]Скачайте zip-архив с библиотекой. [*]Распакуйте его куда-либо на своем сайте, поддерживающим PHP. [*]Наберите в адресной строке броузера: [tt][nobb]http://ваш.сайт/ваш/путь/bbcode/test.html[/nobb][/tt]. Это - демонстрационная фича. - Убедитесь, что скрипт работает. [*]В ваш рабочий скрипт вставьте строчку [align=center][php]include_once 'ваш/путь/bbcode/bbcode.lib.php';[/php][/align] Готово. Можете пользоваться библиотекой. [/list] Скачать zip-архив со скриптом, тестами и набором смайликов можно [url=http://www.pc.uz/files/illustrations/bbcode/bbcode.zip]здесь[/url]. Успешной работы! [table align=center width=95%][tr] [td align=left][b]Дмитрий Скоробогатов[/b] [td align=right]27.07.2006 [/table]