BBcode — это простой текстовый язык разметки, который применяется на форумах, гостевых книгах и в формах комментирования на некоторых сайтах. Этот код прост для освоения новичками и поэтому популярен.
Написанный пользователем текст нужно распарсить из bbcode в html. Для этого есть готовые решения, но я хотел бы предложить свою простую функцию на php, которая делает это. По сути, это набор регулярных выражений, через которые пропускается текст и на выходе мы получаем html.
Итак, для начала нам потребуется тестовый текст. Я воспользовался Яндекс.рефератами и немного поколдовал над результатом, добавив в него разных бибикодов для теста.
Для начала приведу готовую функцию. Потом поясню как она работает. А потом дам скачать скрипт, которым я все тестил и отлаживал.
function parse_bb_code($text) {
$text = preg_replace('/\[(\/?)(b|i|u|s)\s*\]/', "<$1$2>", $text);
$text = preg_replace('/\[code\]/', '<pre><code>', $text);
$text = preg_replace('/\[\/code\]/', '</code></pre>', $text);
$text = preg_replace('/\[(\/?)quote\]/', "<$1blockquote>", $text);
$text = preg_replace('/\[(\/?)quote(\s*=\s*([\'"]?)([^\'"]+)\3\s*)?\]/', "<$1blockquote>Цитата $4:<br>", $text);
$text = preg_replace('/\[url\](?:http:\/\/)?([a-z0-9-.]+\.\w{2,4})\[\/url\]/', "<a href=\"http://$1\">$1</a>", $text);
$text = preg_replace('/\[url\s?=\s?([\'"]?)(?:http:\/\/)?([a-z0-9-.]+\.\w{2,4})\1\](.*?)\[\/url\]/', "<a href=\"http://$2\">$3</a>", $text);
$text = preg_replace('/\[img\s*\]([^\]\[]+)\[\/img\]/', "<img src='$1'/>", $text);
$text = preg_replace('/\[img\s*=\s*([\'"]?)([^\'"\]]+)\1\]/', "<img src='$2'/>", $text);
return $text;
}
Итак, что же делает эта малочитаемая красота?
/\[(\/?)(b|i|u|s)\s*\]/ — разбирает простые теги [b], [i], [u], [s], отвечающие за жирный, курсивный, подчеркнутый и зачеркнутый текст соответственно. Регулярка просто ищет их и заменяет квадратные скобки на треугольные. Потому что html-теги выглядят так же.
Пара регулярок с code нужна для простоты. Первая заменяет [code] на последовательность <pre><code>. Вторая заменяет на обратную последовательность.
Простые цитаты заменяются тегом blockquote. Но на форумах частенько используют адресные цитаты. Когда указывают кого именно цитируют. В этом случае используют синтаксис, похожий на:
[quote="Vasya"][/quote]
В этом случае, нам нужно получить значение атрибута и вставить его в результат. Я просто пишу первой строкой в цитате "Цитата &username%:"
Дальше по списку у нас вкусное. Парсинг bbcode тега url. Когда-то я уже парсил тег url, но на перле и кажется, не всем понятно что делать с этой статьей. Поэтому я адаптировал то решение к php.
Итак, делаем две регулярки. Одна парсит случай, когда ссылка заключена между тегами [url][/url], вторая — когда ссылка идет атрибутом тега. Не буду приводить их еще раз чтобы не шокировать)
Не менее монструозно выглядящие регулярки для парсинга картинок. Обычно применяется простой синтаксис: [img]адрес[/img], но я решил добавить поддержку синтаксиса атрибута, аналогично тегу url. Моя функция парсит конструкции вида [img="адрес"].
Вот и все.
Список поддерживаемых тегов и синтаксиса:
Использование bbcode обезопасит ваш сайт. К тому же, пользователи привыкли к нему и для многих целевых аудиторий использование bbcode вместо html повысит юзабилити сайта. Кстати, если вы хотите, вы можете заказать оценку юзабилити вашего сайта и сделать его еще лучше. Для некоторых сайтов это очень критично. Сам зачастую ухожу с сайта, который крайне неудобен и просто пугает. Например, фейсбук;)
Ах да! Чуть не забыл дать вам скачать скрипт парсинга bbcode на php.
Не забудьте подписаться на обновления моего блога. Тем более, что кроме обычного RSS я добавил возможность подписаться по e-mail.