Функция обработки bb — кодов


Содержание

Веб-разработка

BBcode — это простой текстовый язык разметки, который применяется на форумах, гостевых книгах и в формах комментирования на некоторых сайтах. Этот код прост для освоения новичками и поэтому популярен.

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

Итак, для начала нам потребуется тестовый текст. Я воспользовался Яндекс.рефератами и немного поколдовал над результатом, добавив в него разных бибикодов для теста.

Для начала приведу готовую функцию. Потом поясню как она работает. А потом дам скачать скрипт, которым я все тестил и отлаживал.

Итак, что же делает эта малочитаемая красота?

/\[(\/?)(b|i|u|s)\s*\]/ — разбирает простые теги [b], [i], [u], [s], отвечающие за жирный, курсивный, подчеркнутый и зачеркнутый текст соответственно. Регулярка просто ищет их и заменяет квадратные скобки на треугольные. Потому что html-теги выглядят так же.

Пара регулярок с code нужна для простоты. Первая заменяет [code] на последовательность

В этом случае, нам нужно получить значение атрибута и вставить его в результат. Я просто пишу первой строкой в цитате «Цитата &username%:»

Дальше по списку у нас вкусное. Парсинг bbcode тега url. Когда-то я уже парсил тег url, но на перле и кажется, не всем понятно что делать с этой статьей. Поэтому я адаптировал то решение к php.

Итак, делаем две регулярки. Одна парсит случай, когда ссылка заключена между тегами [url][/url], вторая — когда ссылка идет атрибутом тега. Не буду приводить их еще раз чтобы не шокировать)

Не менее монструозно выглядящие регулярки для парсинга картинок. Обычно применяется простой синтаксис: [img]адрес[/img], но я решил добавить поддержку синтаксиса атрибута, аналогично тегу url. Моя функция парсит конструкции вида [img=»адрес»].

Список поддерживаемых тегов и синтаксиса:

Использование bbcode обезопасит ваш сайт. К тому же, пользователи привыкли к нему и для многих целевых аудиторий использование bbcode вместо html повысит юзабилити сайта. Кстати, если вы хотите, вы можете заказать оценку юзабилити вашего сайта и сделать его еще лучше. Для некоторых сайтов это очень критично. Сам зачастую ухожу с сайта, который крайне неудобен и просто пугает. Например, фейсбук;)

Не забудьте подписаться на обновления моего блога. Тем более, что кроме обычного RSS я добавил возможность подписаться по e-mail.

Функция обработки bb — кодов

bbCode — Bulletin Board Code, или язык разметки, используемый для форматирования сообщений на многих электронных досках объявлений (BBS) и форумах. Для форматирования текста используются теги, подобные тегам HTML. В отличие от тегов HTML, теги bbCode заключают в квадратные скобки. Перед отображением страницы движок форума производит разбор текста и преобразовывает bbCode в HTML-код.

На многих форумах возможность использования BB-кодов настраивается администратором индивидуально на каждый раздел форума. Поэтому, прежде чем использовать BB-коды в сообщениях, необходимо убедиться, что они разрешены.

Базовые тэги для работы с текстом:

[p] Обычный абзац с отступом. [/p]

[p= стиль ] Абзац, которому можно задавать стиль. [/p]
* Здесь и далее «стиль» — это аналог style в HTML.
[p=стиль]текст[/p] аналогично в HTML

** С тэгами [p] [/p] можно использовать другие тэги, такие как [b], [i], [s] и т.д.

[span= стиль ] Текст, которому с помощью стиля можно менять свойства. [/span]

[div= стиль ] Ограниченная область, которой с помощью стиля можно менять свойства (положение, границы, отступы, свойства содержимого и т.д.). [/div]
* По умолчанию границы областей не видны. На одной странице может быть сразу несколько областей [div].

Форматирование текста:

[b] Важный текст, полужирный [/b]

[i] Важный текст, курсив [/i]

[bold] Просто полужирный [/bold]

[italic] Просто курсив [/italic]

[u] Подчёркнутый текст [/u]

[s] Зачёркнутый текст [/s] — аналогично варианту [strike] [/strike]

[small] Уменьшенный шрифт [/small]

Знак сноски [sup] сверху [/sup] или индекс [sub] снизу [/sub] от текста

[del] Удалённый текст [/del]

Размеры шрифта:

[size=13pt] Шрифт размером 13 пунктов [size]

[size=15pt] Шрифт размером 15 пунктов [size]

[size=9px] Шрифт размером 9 пикселей [size]

[size=12px] Шрифт размером 12 пикселей [size]

[size=15px] Шрифт размером 15 пикселей [size]

[size=0] Размер 0 [size]

[size=+1] Размер +1 [size]

[size=+2] Размер +2 [size]

Возможные варианты размеров шрифтов (визуальная оценка) доступны здесь.

Заголовки:

[h1] Заголовок 1-го уровня [/h1]

[h2] Заголовок 2-го уровня [/h2]

[h3] Заголовок 3-го уровня [/h3]

[h4] Заголовок 4-го уровня [/h4]

[h5] Заголовок 5-го уровня [/h5]

[h6] Заголовок 6-го уровня [/h6]

Оформление текста с помощью шрифтов:

[font= Times New Roman ] Шрифт Comic Sans Ms [/font]

[font= Monotype Corsiva ] Шрифт Monotype Corsiva [/font]

[font= Tahoma ] Шрифт Tahoma [/font]

Возможные варианты типов шрифтов (наименования и визуальная оценка) доступны здесь.

Оформление текста с помощью цвета:

[color= Red ] Красный текст [/color]
* Можно пользоваться стандартными словесными обозначениями цветов: Red, Green, Blue и т.д.

[color= #0000ff ] Синий текст [/color]
* Цифра #0000ff означает синий цвет в RGB палитре.


[bg= #eeeeff ] Голубой фон [/bg]
* У фона тоже можно менять цвет.

[color= #0000ff ] [bg= lightgray ] Синий текст, серый фон [/bg] [/color]

Некоторые предопределённые цвета:

Black White Red Green Blue Purple Firebrick Maroon OrangeRed MidnightBlue CornflowerBlue
Cyan Yellow Magenta DarkGreen DarkGoldenrod Gold Orchid BlueViolet Burlywood PeachPuff

Некоторые цвета в шестнадцатиричном коде — интенсивность красного, зелёного и синего ( RR GG BB ):

#000000 #FFFFFF #FF0000 #00FF00 #0000FF #FF00FF #FF4444 #FF9999 #FFCCCC #9999FF #FF99FF #DDDDDD #FFE4C4 #CCCC99 #FF8DC #FA8072 #990000 #FF3030 #000080 #000066 #0000CD #AFEEEE #006400 #66FF00 #00B800 #DAA520 #FFCC33 #FFA500 #C71585 #8B008B #CC33FF

Возможные варианты палитры цветов и их кодов/наименований доступны здесь.

Выравнивание текста:

[left] Выравнивание текста по левой стороне [/left]

[left стиль ] Выравнивание по левой стороне со стилем [/left]

[pleft] Выравнивание в абзаце влево [/pleft]

[center] Выравнивание текста по центру [/center]

[center стиль ] Выравнивание по центру со стилем [/center]

[pcenter] Выравнивание в абзаце по центру [/pcenter]

[right] Выравнивание текста по правой стороне [/right]

[right стиль ] Выравнивание по правой стороне со стилем [/right]

[pright] Выравнивание в абзаце справа [/pright]

[justify] Выравнивание текста по обеим сторонам [/justify]

[justify стиль ] Выравнивание по обеим сторонам со стилем [/justify]

[pjustify] Выравнивание в абзаце по обеим сторонам [/pjustify]
* Выравнивание текстов по обеим сторонам отображается для текстов, имеющих длину более одной строки.

Оформление сносок (комментариев) с отступом абзаца:

[q свойства ] Цитата в строке со свойствами [/q]

[quote]
Процитированный в отдельном блоке текст, у которого будет
небольшой отступ слева и особое оформление (стиль форума).
[/quote]

Примеры:
[quote]Lorem ipsum dolor sit amet[/quote]
[quote=John Doe]Lorem ipsum dolor sit amet[/quote]
[quote=John Doe;54525188]Lorem ipsum dolor sit amet[/quote]

Форматирование параграфов и областей:

Используем тэг [ul] или [list] для маркированных списков:

  • Один из пунктов списка
  • Другой такой пункт
  • Ещё один пункт.

[ul]
[*] Один из пунктов списка [/*]
[*] Другой такой пункт [/*]
[*] Ещё один пункт. [/*]
[/ul]

Для пронумерованных списков используем тэг [ol]:

  1. Один из пунктов списка
  2. Другой такой пункт
  3. Ещё один пункт.

[ol]
[*] Один из пунктов списка [/*]
[*] Другой такой пункт [/*]
[*] Ещё один пункт. [/*]
[/ol]

Закрывающий тэг [/*] не обязателен для использования:

  • Один из пунктов списка
  • Другой такой пункт
  • Ещё один пункт.

[list]
[*] Один из пунктов списка
[*] Другой такой пункт
[*] Ещё один пункт.
[/list]

Также возможно прямое указания вида списка:
[list=1] — пронумерованный список
[list=a] — алфавитный список
[list=i] — список, пронумерованный римскими цифрами

[img] http://img.cx/img/primer.jpg [/img] — пример вставки картинки.

[imgleft] http://img.cx/img/primer.jpg [/imgleft] — картинка слева.
* Данный код аналогичен коду в HTML:

[imgright] http://img.cx/img/primer.jpg [/imgright] — картинка справа.
* Данный код аналогичен коду в HTML:

[imgcenter] http://img.cx/img/primer.jpg [/imgcenter] — картинка по центру.
* Данный код аналогичен коду в HTML:

Аналогичные тэги с названиями и всплывающими подсказками:

Важно! В названии картинки нельзя использовать кавычки!

[img Название ] http://img.cx/img/primer.jpg [/img] — пример вставки картинки.

[imgleft Название ] http://img.cx/img/primer.jpg [/imgleft] — картинка слева.

[imgright Название ] http://img.cx/img/primer.jpg [/imgright] — картинка справа.

[imgcenter Название ] http://img.cx/img/primer.jpg [/imgcenter] — картинка по центру.

Картинки с указанными размерами:

[img=300×500] http://img.cx/img/primer.jpg [/img] — пример картинки с размером.
* Данный код аналогичен коду в HTML:


[imgleft=300×500] http://img.cx/img/primer.jpg [/imgleft] — картинка слева, с размером.

[imgright=300×500] http://img.cx/img/primer.jpg [/imgright] — картинка справа, с размером.

Вставка больших изображений с полосами прокрутки:

[image] http://www.hdsw.ru/pics/IMG_1734.jpg [/image] — картинка в выделенной области, если она больше доступного размера отображения на форуме.

Миниатюры изображения со ссылкой на оригинал:

[imgmini=_ адрес-mini ] адрес [/imgmini] — открыть изображение в новом окне.
* Данный код аналогичен коду в HTML:

[imgmini= адрес-mini ] адрес [/imgmini] — открыть изображение в том же окне.
* Данный код аналогичен коду в HTML:

[url] http://www.hdsw.ru/ [/url] — обычная ссылка.
* Данный код аналогичен коду в HTML:
http://www.hdsw.ru/

Илон Маск рекомендует:  Что такое код apache_setenv

Картинка-ссылка (баннер):
[url= http://www.hdsw.ru/ ] [img] http://img.cx/img/primer.jpg [/img] [/url]

[email] e-mail@example.com [/email] — почтовый ящик как ссылка.
[email= e-mail@example.com ] текст под ссылкой на e-mail [/email]

[icq] номер ICQ [/icq] — вставка ICQ-номера как ссылки.

[skype] логин в Skype [/skype] — вставка учётной записи Skype как ссылки.

[wmid] номер WM >[/wmid] — вставка WebMoney-идентификатора WMID как ссылки.

[wiki] искомое значение [/wiki] — ссылка на значение в энциклопедии.

[wiki= искомое значение ] отображаемый текст [/wiki] — ссылка в текущем тексте (любом) на нужное значение в энциклопедии.

Ссылки внутри форумов и блогов:

[user] имя_пользователя [/user] — ссылка на профиль пользователя.
[user= >] имя_пользователя_произвольно [/user] — ссылка на профиль пользователя с произвольным текстом.

[forum= >] Описание [/forum] — ссылка на подфорум по его ID.

[blog= >] Описание [/blog] — ссылка на блог по его ID.

[thread] >[/thread] — ссылка на тему по его ID.
[thread= >] Описание [/thread]

[topic= >] Описание [/topic] — ссылка на тему по его ID.

[post] >[/post] — ссылка на сообщение по его ID.
[post= >] Описание [/post]

[snapback] >[/snapback] — вставляет маленькую иконку со ссылкой на указанное сообщение по его ID.

[entry= >] Описание [/entry] — ссылка на пост в блоге по его ID.

Пример простейшей таблицы:

Строка 1, колонка 1 Строка 1, колонка 2
Строка 2, колонка 1 Строка 2, колонка 2

[table]
[tr]
[td] Строка 1, колонка 1 [/td]
[td] Строка 1, колонка 2 [/td]
[/tr]
[tr]
[td] Строка 2, колонка 1 [/td]
[td] Строка 2, колонка 2 [/td]
[/tr]
[/table]

В таблице можно указывать произвольные стили и классы. Примеры:
[table ]
[tr rowspan=»2″]
[td style=»font-size: 18pt»]

[br] — тэг переноса строки.

[bs] — вставка неразрывного пробела, преобразуется в

[tab] — вставка отступа на 32 пикселя (4 символа), аналог символа TAB.

[ucase] ТЕКСТ [/ucase] — выделенный текст в верхнем регистре.

[lcase] текст [/lcase] — выделенный текст в нижнем регистре.

[highlight] Этот текст выделен [/highlight] — позволяет выделить ваш текст (цветом/фоном/шрифтом).

Показать скрытое содержание
скрытый текст
— позволяет спрятать большой кусок текста и изображения под ссылку (кат). Пример:
Показать скрытое содержание
[img] http://example.com/1.jpg [/img] скрытый текст

[extract] текст [/extract] — позволяет выделить часть поста в блоге, которая будет показана на титульной странице блога и в RSS feed. Остальной текст будет показан только на странице поста.

[noparse] [b]значение[/b] [/noparse] — отменяет распознавание BB-кодов в выделенном тексте.

[noindex] текст [/noindex] — выделенный текст не будет индексироваться поисковыми системами.

[abbr] аббревиатура [/abbr] — указывает, что последовательность символов является аббревиатурой.
[abbr= расшифровка_аббревиатуры ] аббревиатура [/abbr]

[cite] Сноска [/cite] — помечает текст как цитату или сноску на другой материал.
[cite свойства ] Сноска [/cite]

[address] адрес [/address] — тэг предназначен для хранения информации об авторе и может включать в себя любые элементы вроде ссылок, текста, выделений и т.д.
[address свойства ] адрес [/address]

[text-demo] — подключает файл text-demo.txt (можно использовать для проверки стилей шаблона).

[hr] — тэг вставки линии на всю ширину доступной области:

Для работы с терминами используется тройка элементов [dl], [dt], [dd], предназначенных для создания списка определений. Каждый такой список начинается с контейнера [dl], куда входит тег [dt], создающий термин и тег [dd], задающий определение этого термина. Закрывающий тег [/dt] не обязателен, поскольку следующий тег сообщает о завершении предыдущего элемента. Тем не менее, хорошим стилем является закрывать все теги.

Пример:
[dl]
[dt] Термин 1 [/dt]
[dd] Определение термина 1 [/dd]
[dt] Термин 2 [/dt]
[dd] Определение термина 2 [/dd]
[/dl]

Как правило, в документе, когда упоминается новый термин, он выделяется курсивом и дается его определение. При использовании этого термина в дальнейшем, он считается уже известным читателю. Тег [dfn] применяется для выделения таких терминов, при их первом появлении в тексте.

[dfn] Новый термин [/dfn]

[dfn свойства ] Новый термин [/dfn]

— универсальный тег.

Тэги под специализированные видеохостинги с использованием идентификатора:

[youtube] идентификатор [/youtube] — вставка видеоролика с YouTube.com

[rutube] идентификатор [/rutube] — вставка видеоролика с RuTube.ru

[googlevideo] идентификатор [/googlevideo] — вставка видеоролика с Google.com

[veoh] идентификатор [/veoh] — вставка видеоролика с Veoh.com

[smotri] идентификатор [/smotri] — вставка видеоролика с Smotri.com. Возможна модификация [smotricomvideo]

Тэги под специализированные видеохостинги с использованием ссылки:

[mailvideo] ссылка [/mailvideo] — вставка видеоролика с Mail.ru

[yandexvideo] ссылка [/yandexvideo] — вставка видеоролика с Yandex.ru

Любые flash-объекты (сторонние видеохостинги, flash-игры, flash-баннеры и т.д.) можно использовать с помощью: [flash= ширина,высота ] адрес_объекта [/flash]
* Размер области определяется в пикселях.


Примеры:
[youtube]9L4YCG7dJeE[/youtube]
[v > [googlevideo]8420876204610684862[/googlevideo]
[veoh]v922088SBwxySaR[/veoh]
[yandexvideo]pugachev-alexander/1rgzbi6w6b.809/[/yandexvideo]

BB-код в том числе предназначен для публикации примеров различных кодов. С помощью специального форматирования код будет только отображаться, но не исполняться. Кроме того, программный код будет отображаться с «цветовой подсветкой» (highlight).

[prog= язык ] текст программы [/prog]
где «язык» может принимать значения: cpp, objectivec, cs, delphi, avrasm, 1c, python, profile, perl, erlang, erlang_repl, apache, nginx, php, xml, html, css, java, javascript, vbscript, sql, lisp, django, scala, ruby, go, lua, vala, rsl, rib, mel, smalltalk, bash, cmake, axapta, vhdl, parser3, tex, haskell, dos, ini, diff, no-highlight.

[code] текст моноширинным шрифтом [/code] — любой код и текст.
[code= php ] текст [/code] — код языка PHP с соответствующей «цветовой подсветкой».

[php] отображаемый HTML-код [/php] — код PHP с «цветовой подсветкой».

[html] отображаемый HTML-код [/html] — код HTML с «цветовой подсветкой».

[sql] отображаемый HTML-код [/sql] — SQL-код с «цветовой подсветкой».

Код Символ Для набора на клавиатуре нажмите *
« « ALT+0171
» » ALT+0187
ALT+0151
© © ALT+0169
® ® ALT+0174
ALT+0153
/ /
>
ALT+0160 — неразрывный пробел**

* — Зажмите кнопку ALT, наберите код, отпустите ALT. Работает в Windows.
** — Вставьте подряд несколько таких пробелов чтобы они не сливались в один:
— теперь слева отступ в шесть пробелов!

Возможные варианты символов, их названий и кодов доступны здесь.

Обработка BBcode

taster

Новичок

В общем, задумался над одним вопросом. Как правильнее сделать обработку BBcode в комментариях?
Допустим, есть функция обработки BBcode. При добавлении сообщении я обрабатываю текст этой функцией и ложу в базу данных. При выводе беру текст из базы и вывожу. Вроде бы все нормально, но.
Что мне делать при редактировании сообщения? Ведь в поле ввода вставляется уже обработанный текст из базы. И вместо BBcode там отображаются html-теги.
У меня пока 2 варианта:
1) Ложить в базу 2 варианта текста: обработанный и исходный. Считаю это неправильным, т.к. объем нужной памяти увеличится в 2 раза.
2) При добавлении сообщения не обрабатывать текст и ложить в базу исходный текст. И при выводе обрабатывать каждый комментарий. Считаю это тоже неверным. Если сообщений на одной странице будет очень много, то генерация страницы будет происходить секунды 2-3 минимум.

Что предлагайте Вы? Какой вариант лучше выбрать? Или есть еще варианты?

Фанат

oncle terrible

ты уже пробовал?

Но в принципе, если действительно очень много, то вместо бб используй HTML и какой-нибудь html putifier, который будет пропускать только разрешенные теги без атрибутов.

Поиск и замена (BB-коды)

Здравствуйте, форумчане.
Это моя 3-яя тема на этом форуме.
Подскажите, как при помощи функции preg_replace сделать подобное:
Я имею текст, в нем имеется вот такая вещь: [font color=#color]Текст[/font].
Мне необходимо сделать вот так: Текст .
Я мог бы сделать str_replace, но там конфликты, мне необходимо ИСКЛЮЧИТЕЛЬНО preg_replace.
Я уже по всякому пробовал, все уроки пересмотрел — ничего не получается
Помогите пожалуйста!

Добавлено через 3 часа 1 минуту
Up Up Up

29.04.2013, 20:22

Замена строки на коды символов
Дана строка: 5abc%+ Задание: Заменить строку на коды символов. Помогите пожалуйста.

Сервисные коды S5230 все коды работают сам проверял
все коды работают сам проверял *#197328640# — Debug Screen Version Information RF Test Base.

Дан массив S(50).Вывести те символы (и их коды), коды которых кратны 5 и определить их количество.
Дан массив S(50).Вывести те символы (и их коды), коды которых кратны 5 и определить их количество.

Даны два двоичных числа 10010000 и 00001001. Числа 16-е ASCII–коды и перевести их в 2-е коды
Добрый день, помогите с задачкой: Даны два двоичных числа 10010000 и 00001001. Числа 16-е.

Поиск и замена
Дана строка, в ней найти минимальный элемент и поменять местами с последним элементом Вот код.

PHP и BBCode

У меня периодически появляется потребность в использовании «интерпретатора» BBCode в своих проектах (написанного на PHP), и постоянно нет времени искать какое-то более-менее удобоваримое решение, что в итоге выливается в использование или создание «костылей» для каждого конкретного случая.
Но вот, похоже, получилось найти то, что хотелось.

Моя претензия к подобным готовым решениям обычно в первую очередь заключается в неспособности этих библиотек правильно обрабатывать абзацы. Фактически они обычно вообще не используют абзацы (тэг P), вместо этого в результате своей работы они просто вставляют тег
, заменяя обычные символы переноса строки. Я считаю такой метод эмулирования абзацев в 98 процентах, мягко говоря, не уместным. Но так как перенос строк по средствам
намного легче реализовать вместо «человеческих»

, так большинство и делает �� Некоторые даже придумывают оправдания, что мол с br даже правильнее, отчасти, из-за подобной лени разработчиков различных готовых библиотек, другая часть людей думает, что тэг P является устаревшим (ведь даже во многих готовых продуктах и сайтах абзацы формируются путем использования
) ��

Приступим

Но, кажется, есть свет в конце туннеля. Это готовый класс для работы с BBCode, который, судя по всему, отлично справляется со своей задачей (ничего лучше пока не видел). Единственный минус в том, что документация, представленная на сайте, не на русском языке. Этот минус я и хочу побороть в этой статье, приведя пример использования класса с русскими комментариями.

Илон Маск рекомендует:  Asp разработка масштабируемых компонентов

Для начала нужно скачать библиотеку (на момент написания статьи версия библиотеки была 0.3.3). В скачанном архиве в папке src вы обнаружите два нужных нам файла: stringparser.class.php и stringparser_bbcode.class.php.

Для примера предположим, что у нас есть пустой файл «index.php» и рядом с ним мы создадим папку «/bbcode/», содержащую в себе два упомянутых выше файла.
Для примера минимальное содержимое файла «index.php» должно быть таким (запустив этот пример можно будет сразу увидеть, работает ли библиотека):

Функция addCode

Наибольший интерес в этом коде может вызвать, пожалуй, функция addCode у объекта класса StringParser_BBCode, вот ее прототип и список описание параметров:

Эта функция добавляет понятие о тех или иных кодах (bb-кодах) для объекта класса, чтоб он мог потом обнаружить эти коды в тексте и соответствующим образом обработать их. Т.е. можно сказать, что изначально объект класса StringParser_BBCode вообще ничего не знает о стандартных bb-кодах и не способен обработать как-либо их. Поэтому этот объект нужно будет после каждой инициализации «обучать» всем разновидностям bb-кодов.

$code (в примере имеет значение ‘b’) Код, который нужно искать в тексте для обработки. Т.е. если указать код test , то потом в обрабатываемом тексте будет искаться тэг [test] и обрабатываться в соответствии с указаниями в других параметрах рассматриваемой функции. $type (в примере имеет значение ‘simple_replace’) Указание того, как тэг должен обрабатываться (какого он типа). Есть различные предопределенные типы тэгов, которые будут описаны ниже. В нашем же примере указан тип ‘simple_replace’ который указывает на то, что тэг будет парным (открывающийся тэг [b] и закрывающийся [/b]) и что эти тэги будут заменены на указанные ниже html тэги. $callback (в примере имеет значение null) Позволяет указать имя функции, которая должна будет вызваться при обработке найденного тэга в тексте. В случае с типом тэга ‘simple_replace’ такая функция не вызывается, и, соответственно, в этом параметре можно указать null. $params (в примере имеет значение array(‘start_tag’ => ‘‘, ‘end_tag’ => ‘‘)) В этом параметре в основном указывается, какой нужно вставлять html тэг взамен bb тэга. Наименование параметров напрямую зависит от того, какой тип тэга мы указали в параметре $type. $content_type (в примере имеет значение ‘inline’) Тип внутреннего содержимого тега. Может принимать значения: ‘inline’, ‘block’, ‘link’, ‘image’. Если я не ошибаюсь, можно прописывать и свои типы чтобы потом можно было указывать для этого содержимого свои индивидуальные фильтры (пример использования фильтров смотрите ниже). $allowed_in (в примере имеет значение array (‘block’, ‘inline’)) В этом параметре можно указать, внутри каких типов объектов может находиться создаваемый bb-код (его обработка будет просто игнорироваться в ином случае). В нашем примере мы указали, что элемент может находиться как внутри блочных элементов, так и внутри линейных. $not_allowed_in (в примере имеет значение array ()) Имеет назначение, противоположное по смыслу предыдущему параметру.

Виды обработки тэгов

Описание вариантов значения параметра $type в функции addCode.

‘simple_replace’ Описывает простой парный тэг. При использовании этого типа обработки тэга в параметре функции ‘params’ должны обязательно присутствовать две ячейки: $params[‘start_tag’] и $params[‘end_tag’]. ‘start_tag’ должен в себе содержать аналог открывающегося тэга в хтмл, а ‘end_tag’ – закрывающегося тэга соответственно. ‘simple_replace_single’ То же самое, что ‘simple_replace’, но используется только лишь для одинарных тэгов, которые, собственно говоря, не имеют содержимого (типа br, hr и т.п.). Требует наличия только параметра $params[‘start_tag’]. ‘callback_replace’ При этом типе вы перекладываете на себя обработку по найденным совпадениям (с помощью своей callback функции) для парного тэга. ‘callback_replace_single’ То же самое, что и ‘callback_replace’, но только для одинарных тэгов. ‘usecontent’ То же самое что и ‘callback_replace’, только в содержимом такого тэга другие тэги не будут обрабатываться, например, это удобно для тэга code. ‘usecontent?’ Этот тип может себя вести как ‘usecontent’ или же как ‘callback_replace’ в зависимости от ситуации. Актуальность того или иного варианта определяется за счет присутствия заранее предполагаемого атрибута в bb тэге. Если атрибут найден, то будет использоваться обработка ‘callback_replace’, в другом случае тэг будет обрабатываться как ‘usecontent’. Имя атрибута для поиска указывается через параметр $params[‘usecontent_param’]. Если указано имя default, то подразумевается значение атрибута, присвоенное непосредственно тэгу, например, [url=http://link], значением атрибута default будет текст «http://link». Этот прием часто используется, например, для тэга [URL]. Этот тэг может использоваться в двух формах: [url]http://www.example.com/[/url] и [url=http://www.example.com/]Текст ссылки, а так же [b]жирный[/b] текст[/url]. В первом случае будет использоваться тип ‘usecontent’, т.к. текст ссылки должен выводиться без какого-либо форматирования (и, собственно, сама ссылка будет некорректна, если в ней будут посторонние символы). В другом случае должен быть использован тип ‘callback_replace’, т.к. сама ссылка передается отдельным параметром, а текст, обрамленный в ссылку, вполне может содержать в себе какое-то форматирование.
Примечание: Можно указать несколько параметров для их поиска, для чего в $params[‘usecontent_param’] нужно передать не строку, а массив, содержащий строки. Например: $bbcode->addCode (…, array(‘usecontent_param’ => array (‘parameter1’, ‘parameter2’)), …);. ‘callback_replace?’ Является противоположным вариантом типа ‘usecontent?’. Если один из атрибутов, указанных в usecontent_param, встречается в тэге, он будет обработан как ‘usecontent’, в противном случае как ‘callback_replace’.

Пример кода из «боевых» условий

Вот пример файла index.php с более расширенной конфигурацией класса для обрабатывания большего числа тэгов, в нем же и можно понять, как работают callback функции и т.п.:

Послесловие

Я, конечно же, не сделал полный перевод документации, а только самый необходимый минимум, за более подробной документацией вы можете обратиться на официальный сайт (вообще, там описано куда больше различных возможностей).

Эту библиотеку также не составляет труда внедрить в какой-либо php фреймворк, я, к примеру, с успехом проделывал это для cackePHP.

Если вы тоже встречали подобные библиотеки (корректно работающие с абзацам! �� ) , интересно было бы узнать о них.

bbcode_create

(PECL bbcode >= 0.9.0)

bbcode_create — Создает ресурс BBCode

Описание

Эта функция возвращает новый ресурс BBCode, используемый для разбора строк с BBCode.

Список параметров

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

  • flags необязательный — флаг, устанавливаемый на основе констант BBCODE_FLAGS_*.
  • type обязательный — целочисленное значение, указывающее тип тега. Использует константы BBCODE_TYPE_*.
  • open_tag обязательный — HTML-строка для замены открывающего тега.
  • close_tag обязательный — HTML-строка для замены закрывающего тега.
  • default_arg необязательный — это значение используется как параметр по умолчанию, если он не задан и tag_type установлен в OPTARG.
  • content_handling необязательный — Задает callback-функцию для модификации контента. Объектно ориентированная нотация поддерживается только в версии 0.10.1. Прототип callback-функции это строка «name(string $content, string $argument)»
  • param_handling необязательный — Задает callback-функцию для модификации аргумента. Объектно-ориентированная нотация поддерживается только в версии 0.10.1. Прототип callback-функции это строка «name(string $content, string $argument)»
  • childs необязательный — Список разрешенных дочерних тегов для этого тега. Формат списка — строка, с запятыми в качестве разделителя. Если список начинается с !, это список запрещенных дочерних тегов для данного тега.
  • parent необязательный — Список разрешенных родителей для этого тега. Формат списка — строка, с запятыми в качестве разделителя.

Возвращаемые значения

Примеры


Пример #1 Пример использования bbcode_create()

простейший редактор bb кодов

div class =»bb_bar» >
a href =»#» alt =»b» > Жирный a >
a href =»#» alt =»i» > Курсив a >
a href =»#» alt =»u» > Подчеркнутый a >
a href =»#» alt =’a[href=»»]’ > Ссылка a >
div >
textarea id =»user_text» > textarea >

script >
$( document ).ready( function () <
$( ‘.bb_bar a’ ).click( function () <
var button_ >this ).attr( «alt» );
button_ >» );
if (/\[.*\]/.test(attribs)) < attribs = attribs.replace(/.*\[(.*)\]/, ' $1' ); >else attribs = » ;
var start = ‘[‘ +button_ >’]’ ;
var end = ‘[/’ +button_ >’]’ ;
insert(start, end);
return false ;
>);
>);
function insert(start, end) <
element = document .getElementBy >’user_text’ );
if ( document .selection) <
element.focus();
sel = document .selection.createRange();
sel.text = start + sel.text + end;
> else if (element.selectionStart || element.selectionStart == ‘0’ ) <
element.focus();
var startPos = element.selectionStart;
var endPos = element.selectionEnd;
element.value = element.value.substring(0, startPos) + start + element.value.substring(startPos, endPos) + end + element.value.substring(endPos, element.value.length);
> else <
element.value += start + end;
>
>
script >

* This source code was highlighted with Source Code Highlighter .

Вот собственно и весь код.
Работающий пример

Next Generation CMS :: Форум поддержки

Заинтересовала наша система? Тогда этот форум для Вас!

Объявление

Страниц: 1

#1 2012-09-19 15:58:15

Добавление функции в bbcode [IMG]

Всем привет.
Мне нужно добавить такую функцию в bbcode [img], чтобы появилась возможность выравнивать картинку по центру автоматически. Простыми тегами [center][/center] это тоже можно сделать, но это будет не валидатно, нашел как добавлять по валидации:

Как расположить картинку по центру

Сам я конечно понимаю этот код,а вот пользователь который захочет добавить новость на сайте не поймет. Как добавить в bbcode функцию, которая бы автоматически добавляла к этому коду

такое значение как style=»display: block; margin: 0 auto; border: none;»?
Заранее спасибо

#2 2012-09-19 16:08:17

Re: Добавление функции в bbcode [IMG]

TYNGO, это точно не валидно, ибо как говорят все должно быть в css прописано и это в обще очень странный подход.

Все сайты, что могут быть сделаны на ng cms, должны быть сделаны на ng cms.

Расширив границы сознания, мы открываем новые горизонты жизни.

#3 2012-09-19 16:27:56

Re: Добавление функции в bbcode [IMG]

Что бы вам выровнять картинку по центру, это нужно прописать в стилях css именно к блоку в котором находится картинка.
Например.

В стилях css соответственно:

В этом случае ваша картинка будет отцентрована в нужном вам блоке.

Можно через свойство float

/engine/lang/russian/admin/images.ini
в строке insert_file добавить класс.

В файле стилей добавить

Отредактированно FNS (2012-09-19 16:41:10)

#4 2012-09-19 17:26:21

Re: Добавление функции в bbcode [IMG]

FNS, спасибо, попробую сделать,

ещё вопрос, в какой файле убрать target_blank, чтобы не перекидывало на новую вкладку при нажатии на автора новости

Илон Маск рекомендует:  Что такое код asp hcscriptfileextensions

#5 2012-09-19 17:50:28

Re: Добавление функции в bbcode [IMG]

класс выходит, но не выравнивает, в стилях все вставил

#6 2013-04-15 16:56:42

Re: Добавление функции в bbcode [IMG]

Похожий вопрос, как все таки добавлять функции в панель bbcod-ов. Можно ли это сделать?(Добавить несколько своих кнопок и прописать какая какой код вызывает). Если возможно то как это сделать?

#7 2013-04-22 17:06:51

Re: Добавление функции в bbcode [IMG]

Хотя бы скажите какой файл отвечает за bb коды, пожалуйста.

#8 2013-05-09 19:49:16

Re: Добавление функции в bbcode [IMG]

За обработку BB кодов отвечает функция bbcodes() из файла /engine/includes/classes/parse.class.php

Страниц: 1

[ Generated in 0.007 seconds, 14 queries executed ]

Функция обработки bb — кодов

Как сделать текст жирным, наклонным или подчёркнутым BBCode включает теги для быстрого изменения стиля шрифта, сделать это можно следующими способами:

    Чтобы сделать текст жирным, заключите его в [b][/b], например:

[b]Привет[/b]

станет Привет
Для подчёркивания используйте [u][/u], например:

[u]Доброе утро[/u]

станет Доброе утро
Курсив делается тегами [i][/i], например:

Это [i]здорово![/i]

выдаст Это здорово!


Как изменить цвет или размер текста Для изменения цвета или размера шрифта могут быть использованы следующие теги (окончательный вид будет зависеть от системы и браузера пользователя):

    Цвет текста можно изменить, окружив его [color=][/color]. Вы можете указать либо известное имя цвета (red, blue, yellow и т. п.), или шестнадцатеричное представление, например #FFFFFF, #000000. Таким образом, для создания красного текста вы можете использовать:

    [color=red]Привет![/color]

    [color=#FF0000]Привет![/color]

    оба способа дадут в результате Привет!
    Изменение размера достигается аналогичным образом при использовании [size=][/size]. Этот тег зависит от используемых шаблонов, рекомендуемый формат — число, показывающее размер текста в процентах, от 20% (очень маленький) до 200% (очень большой) от размера по умолчанию. Например:

    [size=30]МАЛЕНЬКИЙ[/size]

    скорее всего будет МАЛЕНЬКИЙ

    [size=200]ОГРОМНЫЙ![/size]

    будет ОГРОМНЫЙ!

Могу ли я комбинировать теги? Да, конечно, можете. Например, для привлечения чьего-то внимания вы сможете написать:

[size=200][color=red][b]ПОСМОТРИТЕ НА МЕНЯ![/b][/color][/size]

что выдаст ПОСМОТРИТЕ НА МЕНЯ!

Мы не рекомендуем выводить таким образом длинные тексты! Учтите, что вы, автор сообщения, должны позаботиться о том, чтобы теги были правильно вложены. Вот этот BBCode, например, неправилен:

[b][u]Это неверно[/b][/u]

Создание ссылок

Ссылки на другой сайт В BBCode поддерживается несколько способов создания URL’ов.

    Первый из них использует тег [url=][/url], после знака = должен идти нужный URL. Например, для ссылки на phpbbex.com вы могли бы использовать:

[url=http://phpbbex.com/]Посетите форум phpBBex![/url]

Это создаст следующую ссылку: Посетите форум phpBBex! Учтите, что ссылка будет открываться в том же или в новом окне, в зависимости от настроек браузера пользователя.
Если вы хотите, чтобы в качестве текста ссылки показывался сам URL, вы можете просто сделать следующее:

[url]http://phpbbex.com/[/url]

Это выдаст следующую ссылку: http://phpbbex.com/

  • Кроме того, phpBBex поддерживает возможность, называемую Автоматические ссылки, это переведёт любой синтаксически правильный URL в ссылку без необходимости указания тегов и даже префикса http://. Например, ввод www.phpbbex.com в ваше сообщение приведёт к автоматической выдаче www.phpbbex.com при просмотре сообщения.
  • То же самое относится и к адресам email, вы можете либо указать адрес в явном виде:

    [email]example@mail.com[/email]

    что выдаст example@mail.com, или просто ввести example@mail.com в ваше сообщение, и он будет автоматически преобразован при просмотре.

    Как и со всеми прочими тегами BBCode, вы можете заключать в URL’ы любые другие теги, например [img][/img] (см. следующий пункт), [b][/b] и т. д. Как и с тегами форматирования, правильная вложенность тегов зависит от вас, например:

    [url=http://phpbbex.com/][img]http://phpbbex.com/logo.png[/url][/img]

    неверно , что может привести к последующему удалению вашего сообщения, так что будьте аккуратнее.

    Показ изображений в сообщениях

    Добавление изображения в сообщение BBCode включает тег для добавления картинки в ваше сообщение. При этом следует помнить две очень важные вещи: во-первых, многих пользователей раздражает большое количество изображений, во-вторых, ваше изображение уже должно быть размещено в интернете (т. е. оно не может быть расположено только на вашем компьютере, если, конечно, вы не запустили на нём веб-сервер!). На данный момент нет возможности хранить изображения локально на phpBBex (ожидается, что это ограничение будет снято в следующей версии phpBBex). Для вывода изображения вы должны окружить его URL тегами [img][/img]. Например:

    [img]http://phpbbex.com/logo.png[/img]

    Как указано в предыдущем пункте, вы можете заключить изображение в теги [url][/url], то есть

    [url=http://phpbbex.com/][img]http://phpbbex.com/logo.png[/img][/url]

    Добавление вложений в сообщение Теперь вложения могут быть помещены в любой части сообщения при помощи нового тега BBCode [attachment=][/attachment], если вложения разрешены администратором форума и если вы имеете необходимые права доступа. На странице размещения сообщения находится выпадающий список (соответственно кнопка) для размещения вложений в сообщении.

    Цитирование и вывод форматированных текстов

    Цитирование при ответах Есть два способа процитировать текст, со ссылкой и без.

      Когда вы используете кнопку «Цитата» для ответа на сообщение, то его текст добавляется в поле ввода окружённым блоком [quote=»»][/quote]. Этот метод позволит вам цитировать со ссылкой на автора либо на что-то ещё, что вы туда впишете. Например, для цитирования отрывка текста, написанного Mr. Blobby, вы напишете:

    [quote=»Mr. Blobby»]Текст Mr. Blobby будет здесь[/quote]

    В результате перед текстом будут вставлены слова «Mr. Blobby писал(а):». Помните, вы должны заключить имя в кавычки «», они не могут быть опущены.

  • Второй метод просто позволяет вам что-то процитировать. Для этого вам надо заключить текст в теги [quote][/quote]. При просмотре сообщения будет просто показан текст в блоке цитирования.
  • Вывод кода или форматированного текста Если вам необходимо вывести программный код или что-то, что должно быть выведено моноширным шрифтом, вы должны заключить текст в теги [code][/code] (для больших текстов, оформляется в виде отдельного блока) или [tt][/tt] (для коротких однострочных текстов, без отдельного блока), например:

    [code]echo «This is some code»;[/code]

    Всё форматирование, используемое внутри тегов [code][/code] и [tt][/tt], будет сохранено. Подсветка синтаксиса языка PHP может быть включена с помощью [code=php][/code] и рекомендуется при отправке сообщений с PHP-кодом для улучшения его удобочитаемости.

    Создание списков

    Создание маркированного списка BBCode поддерживает два вида списков: маркированные и нумерованные. Они практически идентичны своим эквивалентам из HTML. В маркированном списке все элементы выводятся последовательно, каждый отмечается символом-маркером. Для создания маркированного списка используйте [list][/list] и определите каждый элемент при помощи [*]. Например, чтобы вывести свои любимые цвета, вы можете использовать:

    [list]
    [*]Красный
    [*]Синий
    [*]Жёлтый
    [/list]

    Это выдаст такой список:

    • Красный
    • Синий
    • Жёлтый

    Создание нумерованного списка Второй тип списка, нумерованный, позволяет выбрать, что именно будет выводиться перед каждым элементом. Для создания нумерованного списка используйте [list=1][/list] или [list=a][/list] для создания алфавитного списка. Как и в случае маркированного списка, элементы определяются с помощью [*]. Например:

    [list=1]
    [*]Пойти в магазин
    [*]Купить новый компьютер
    [*]Обругать компьютер, когда случится ошибка
    [/list]

    выдаст следующее:

    1. Пойти в магазин
    2. Купить новый компьютер
    3. Обругать компьютер, когда случится ошибка

    Для алфавитного списка используйте:

    [list=a]
    [*]Первый возможный ответ
    [*]Второй возможный ответ
    [*]Третий возможный ответ
    [/list]

    что выдаст

    1. Первый возможный ответ
    2. Второй возможный ответ
    3. Третий возможный ответ

    Интернет, компьютеры, софт и прочий Hi-Tech

    Сервисы
    Избранные доки
    Метки (все метки)
    Дополнительно

    2 способа обработки BBCode

    Перевод с английского. Оригинальный текст: 2 ways of BBCode handling

    На некоторых форумах, в гостевых книгах и в прочих аналогичных скриптах, где пользователи могут оставлять свои сообщения, мало использовать обычное поле ввода. Люди привыкли вставлять в тексты выделения вроде подчеркивания или жирного шрифта. Как это позволяет MS Word и подобные редакторы.

    Это не только делает сообщение более красивым, но и добавляет ему читабельности и юзабельности (как, например, возможность поставить гиперссылку на другой сайт, а не просто вбить его адрес).

    Такие возможности теперь используются повсеместно. Но как нам самим реализовать их? Именно об этом я и собираюсь сегодня рассказать.

    Первое, что приходит на ум, — разрешить пользователям вводить код HTML в поле ввода. В других словах, если пользователь пишет что-то типа

    то разрешить ему писать так:

    чтобы остальные пользователи увидели в своих браузерах такой вывод:

    Все ничего, но этот способ имеет 2 небольших недостатка.

    Первый из них, — сообщения будут выводиться в окружении HTML-кода страницы. Однажды в какое-то сообщение будет введено «

    » или типа того. При выводе этого сообщения разметка сайта будет нарушена, и в лучшем случае сайт распадется на пазлы.

    Более того, если кто-нибудь вместе с HTML введет в сообщение код JavaScript, то он выполнится в браузерах всех других пользователей, посетивших страницу с этим сообщением. Этот JS может всего лишь напугать, если будет чем-то вроде «alert(‘Hello, world!’);». Но он может оказаться и скриптом в 5 страниц, который украдет ваш кошелек WebMoney, а после этого отформатирует ваш жесткий диск.

    Второй и главный недостаток, — это то, что не все пользователи Интернета знают HTML.

    Обобщив все вышесказанное умный человек придумал BBCode, который вместе с JavaScript решает все наши проблемы.

    В результате мы имеем то же самое поле ввода, но теперь с кнопками, похожими на кнопки MS Word, с помощью которых можно размечать текст как жирный, наклонный и т.п.

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

    BBCode похож на HTML, но он не есть HTML (это решает первую проблему). А кнопки дают пользователям удобный интерфейс (это решает вторую и главную проблему).

    После того, как пользователь ввел сообщение и нажал на кнопку «отправить», сообщение пересылается PHP-скрипту, который должен сконвертировать BBCode в HTML и сохранить результат в базе данных.

    Теоретически есть два способа реализовать эту конвертацию.

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL