Парсинг BB-кодов
Если Вы создавали форум или создавали возможность комментирования на сайте, то, вполне вероятно, что Вы сталкивались с BB-кодами. На всякий случай, BB-коды - это набор тегов, похожих на HTML-теги, которые созданы для редактирования внешнего вида сообщения. Например, [b][/b], [url=http://google.ru]Google[/url], [img]http://myrusakov.ru/img.jpg[/img] - это всё различные BB-коды. И вот задача программиста состоит в том, чтобы преобразовать BB-коды в HTML-код. Вот парсингом BB-кода и превращением его в HTML-код, мы и займёмся в этой статье.
Сразу привожу код этого скрипта, а точнее функции, которая принимает текст с BB-кодами, а возвращает уже HTML-код:
<?php
protected function replaceBBCode($text_post) {
$str_search = array(
"#\\\n#is",
"#\[b\](.+?)\[\/b\]#is",
"#\[i\](.+?)\[\/i\]#is",
"#\[u\](.+?)\[\/u\]#is",
"#\[code\](.+?)\[\/code\]#is",
"#\[quote\](.+?)\[\/quote\]#is",
"#\[url=(.+?)\](.+?)\[\/url\]#is",
"#\[url\](.+?)\[\/url\]#is",
"#\[img\](.+?)\[\/img\]#is",
"#\[size=(.+?)\](.+?)\[\/size\]#is",
"#\[color=(.+?)\](.+?)\[\/color\]#is",
"#\[list\](.+?)\[\/list\]#is",
"#\[listn](.+?)\[\/listn\]#is",
"#\[\*\](.+?)\[\/\*\]#"
);
$str_replace = array(
"<br />",
"<b>\\1</b>",
"<i>\\1</i>",
"<span style='text-decoration:underline'>\\1</span>",
"<code class='code'>\\1</code>",
"<table width = '95%'><tr><td>Цитата</td></tr><tr><td class='quote'>\\1</td></tr></table>",
"<a href='\\1'>\\2</a>",
"<a href='\\1'>\\1</a>",
"<img src='\\1' alt = 'Изображение' />",
"<span style='font-size:\\1%'>\\2</span>",
"<span style='color:\\1'>\\2</span>",
"<ul>\\1</ul>",
"<ol>\\1</ol>",
"<li>\\1</li>"
);
return preg_replace($str_search, $str_replace, $text_post);
}
?>
Как видите, казалось бы сложная задача элементарно решается фактически одной функцией - preg_replace(). Поэтому, когда меня спрашивают, а нужны ли эти регулярные выражения, я всегда отвечаю: "Да!". Если бы Вы решали эту задачу обычными строковыми функциями, то кода было бы намного больше, а результат был бы, скорее всего, хуже. Единственное, что в данной функции не делается - это проверка на корректность входных данных. Ведь пользователь может не закрыть тег (случайно удалил его, например) или, например, не соблюдать вложенность тегов, да много чего ещё. На практике, такими проверками никто не занимается, а в случае "кривого" сообщения, его правят вручную (обычно дефектность сразу видна).
Надеюсь, данная функция поможет Вам в парсинге BB-кодов. По аналогии, Вы можете добавить ещё различных BB-кодов, например, BB-код вставки видео с YouTube.
-
- Михаил Русаков
Комментарии (37):
Спасибо огромное!))
Ответить
Вот точно так же и с вики разметкой. Можно и свою размтку придумать на сайт.
Ответить
Михаил вот не знал куда обратится с таким вопросом как сделать чтоб не табличка не разьезжалась, вот форма есть на сайте даже вот взять вашу форму добавления комментариев, если я сейчас напишу слово очень длинное то ваш дизайн не сломается, а слово перенесется на другую строку, как же мне сделать так же? вввввввввввввввввввввввввввввввввввввв
Ответить
о, прошу прощения, и у вас та же проблема. Как ее решить может вы знаете?
Ответить
В принципе можно написать на php скрипт, который будет обрезать слова больше определенной длины и остаток переносить на следующую строку.
Ответить
CSS - word-wrap: break-word; /* Перенос слов */
Ответить
нашел такой скрипт: <?php $bbcode = array( '/\[i\](.+?)\[\/i\]/isU' => '<em>$1</em>', '/\[b\](.+?)\[\/b\]/isU' => '<strong>$1</strong>', '/\[sub\](.+?)\[\/sub\]/isU' => '<sub>$1</sub>', '/\[sup\](.+?)\[\/sup\]/isU' => '<sup>$1</sup>', '/\[del\](.+?)\[\/del\]/isU' => '<del>$1</del>', '/\[u\](.+?)\[\/u\]/isU' => '<span style="text-decoration:underline;">$1</span>', '/\[big\](.+?)\[\/big\]/isU' => '<span style="font-size:large;">$1</span>', '/\[small\](.+?)\[\/small\]/isU' => '<span style="font-size:small;">$1</span>', '/\[code\](.+?)\[\/code\]/isU' => '<code>$1</code>', '/\[red\](.+?)\[\/red\]/isU' => '<span style="color:#ff0000;">$1</span>', '/\[yellow\](.+?)\[\/yellow\]/isU' => '<span style="color:#ffff00;">$1</span>', '/\[green\](.+?)\[\/green\]/isU' => '<span style="color:#00ff00;">$1</span>', '/\[blue\](.+?)\[\/blue\]/isU' => '<span style="color:#0000ff;">$1</span>', '/\[size=([0-9]+)\](.+?)\[\/size\]/isU' => '<span style="font-size:$1px;">$2</span>', '#\[color=(\#[0-9A-F]{3,6}|[a-z\-]+)\](.*)\[/color\]#isU' => '<span style="color:\\1">\\2</span>', '#\[align=(left|right|center)\](.*)\[/align\]#isU' => '<p style="text-align: \\1">\\2</p>', '#\[img=(.*?)\](.+?)\[\/img\]#' => '<img src="$2" align="$1">', '#\[img\](.+?)\[\/img\]#' => '<img src="$1">', '/\:\)/isU' => '<img src="smiles/smile.gif">' ); ?> предположим нужно отредактировать уже посланное сообщение. для этого нужно хтмд обратно в ббкод... кое что уже переделал в обратную функцию. вот: <?php $bbcodeEncode = array( '/\<em\>(.+?)\<\/em\>/isU' => '[i]$1[/i]', '/\<strong\>(.+?)\<\/strong\>/isU' => '[b]$1[/b]', '/\<sub\>(.+?)\<\/sub\>/isU' => '[sub]$1[/sub]', '/\<sup\>(.+?)\<\/sup\>/isU' => '[sup]$1[/sup]', '/\<del\>(.+?)\<\/del\>/isU' => '[del]$1[/del]', '/\<span style=\"text\-decoration\:underline\;\"\>(.+?)\<\/span\>/isU' => '[u]$1[/u]', '/\<span style=\"font\-size\:large\;\"\>(.+?)\<\/span\>/isU' => '[big]$1[/big]', '/\<span style=\"font\-size\:small\;\"\>(.+?)\<\/span\>/isU' => '[small]$1[/small]', '/\<code\>(.+?)\<\/code\>/isU' => '[code]$1[/code]', '/\<span style=\"font\-size\:([0-9]+)px\;\"\>(.+?)\<\/span\>/isU' => '[size=$1]$2[/size]', '/\<span style=\"color\:(\#[0-9A-F]{3,6}|[a-z\-]+)\"\>(.*?)\<\/span\>/isU' => '[color=\\1]\\2[/color]', '/\<p style=\"text\-align\:(left|right|center)\"\>(.*?)\<\/p\>/isU' => '[align=\\1]\\2[/align]', '/\<img src=\"(.+?)\" align=\"(.*?)\"\>/' => '[img=$1]$2[/img]', '/\<img src=\"(.+?)\"\>/' => '[img]$1[/img]', '/\<img src=\"smiles\/smile.gif\"\>/isU' => ':)' ); ?> так вот... предположим добавим строчку: [u]проверка[/u] [b]различных[/b] [color=green]тегов[/color] в базу пишется всё грамотно: <span style="text-decoration:underline;">проверка</span> <strong>различных</strong> <span style="color:green">тегов</span> теперь хочу отредактировать и получаю: [u]проверка</span> [b]различных[/b] <span style="color:green">тегов[/u] помогите, как это решить?!
Ответить
Михаил, а как сделать так чтобы например в ссылке можно было-бы поставить после url= тоесть после ссылки поставить слово target=blank и в ссылку добавилось target = "_blank" ? Подскажите как сделать, а лучше дайте готовую регулярку. Я вас очень прошу
Ответить
"<a href='\\1'>\\2</a>" - вот сюда добавьте этот атрибут.
Ответить
Так мне же не все ссылки нужны с бланком, мне бы отделбную регулярку или исправленную... Дайте код пожалуйста
Ответить
"#\[url=(.+?) t=(.+?)\](.+?)\[\/url\]#is" "<a href='\\1' target='\\2'>\\3</a>"
Ответить
Спасибо большое, а что можно поставить вместо \\1? или только \\ работает в данном примере?
Ответить
Не работает почему-то "#\[url=(.+?) t=(.+?)\](.+?)\[\/url\]#is", этим нужно заменить или поставить ещё одно условие?
Ответить
Ничего менять не нужно, вот пример работы: preg_replace("#\[url=(.+?) t=(.+?)\](.+?)\[\/url\]#is", "<a href='\\1' target='\\2'>\\3</a>", "[url=http://mysite.ru t=blank]сайт[/url]");
Ответить
Ну всё равно не работает, посмотрите сами http://malinichev.ru/lesson/php-browser-user.html в статье есть ссылка на пример и она не работает, если заменить то не работает и если поставить ещё одно условие тоже не работает
Ответить
Вы старые url не удаляли? Там есть ещё 2 других варианта, вот этот третий нужно дописать, а не замещать ими 2 предыдущих. И смотрите внимательно, как пишется BB-код: [url=http://mysite.ru t=blank]сайт[/url]
Ответить
А вы у себя проверяли? Просто у меня не работает, и к ссылке просто прибавляется t=_blank, старые не удалял, но всё равно не работает... Я уже не знаю что делать даже
Ответить
<a href='http://mysite.ru' target='blank'>сайт</a> - вот, что получается у меня после обработки.
Ответить
А как отменить действие работы ббкодов? Просто если в коде писать регулярку ссылки, то она становиться ссылкой, как это отменить?
Ответить
Сделать обратное преобразование, опять же используя регулярные выражения. Хотя вообще в базе обычно хранятся BB-коды, которые потом выводятся в виде HTML, а при редактировании сообщения как раз выводятся BB-коды, что очень удобно.
Ответить
Михаил ты ЛУЧШИЙ!
Ответить
Здравствуйте Михаил. Используя Вашу функцию replaceBBCode, как сделать(добавить) так чтобы она заменяла текстовые смайлы ;) :( :angry: на <img src="smiles/sm1.png"><img src="smiles/sm2.png">. Помогите пожалуйста
Ответить
$text = str_replace(array(":)", ":("), array("<img ...", "<img ..."), $text); - думаю, принцип ясен.
Ответить
не подскажете каким кодом нужно вставлять теги в форму,я использую js,но он не совсем удобен
Ответить
Шамиль, не совсем понял Ваш вопрос.
Ответить
я в принцепе тоже ничего не понимаю,но чтобы работали теги например [b][/b],они должны быть в форме. С помошью input я их туда добавляю.Но здесь такого кода нет.
Ответить
Некоторые js коды вставки тегов не подерживаются мобильными браузерами,как раз таким кодом пользуюсь, хотел поинтересоваться,есть ли универсальные.а вообще на ум пришла мысль с помощью hidden вставить в textarea тег для ссылок и изображений
Ответить
Все отлично работает, но если пустить через эту функцию стрoку, например, такую: "[b][b][b]test[/b][/b][/b]", то всеместо такого: "(жирный)test(жирный)", я получаю такое: "[b][b](жирный)test(жирный)[/b][/b]". Как это можно исправить?
Ответить
ну так вы синтаксис нарушили)
Ответить
Здравствуйте Михаил! Создал файл с Вашим приведённым кодом парсинга в файл, и подключил его к страничке с примером bb-кода командой <?php require_once ('pars_bb-code.php'); ?> в результате выпадает такое сообщение: Parse error: syntax error, unexpected 'protected' (T_PROTECTED) in E:\OpenServer\domains\home\www\bloks\pars_bb-code.php on line 2 Подскажите, как исправить ошибку?
Ответить
А ты его в класс пихнул и вызываешь из класса? Надо либо пихать в класс и из него же вызывать. А если уберешь protected, то вызывай сколько хочешь
Ответить
Компания ООО «ЭкоЮгСтройКлимат» http://stroyklimat.ru34.com - продажа, монтаж, ремонт и обслуживание холодильного, климатического, вентиляционного и котельного оборудования в Волгограде, Волгоградской области и регионах РФ. Профессиональное оборудование – очень важный элемент в системе функционирования предприятий общественного питания, торговли, развлекательных центров. Каждая более-менее крупная организация имеет свое штатное профессиональное оборудование. Но если ремонт профессионального оборудования требуется крупному предприятию, для которого от качественной его работы зависит вообще возможность работать, скорость выполнения ремонтных работ становится крайне важной.
Ответить
Дейтяльность нашей компании: *продажа торгового холодильного оборудования http://stroyklimat.ru34.com/kypit/kypit-holodilnoe-oborudovanie *обслуживание, ремонт, монтаж торгового холодильного оборудования http://stroyklimat.ru34.com/montazh/montazh-holodilnogo-oborudovaniya *продажа сплит-систем и промышленных систем кондиционирования воздуха. *продажа, обслуживание, ремонт, монтаж систем вентиляции http://stroyklimat.ru34.com/services/montaj_sistem_ventilyatcii *проектирование, поставка, монтаж, обслуживание, ремонт котельных и котельного оборудования http://stroyklimat.ru34.com/services/kotelnie/montaj_kotelnogo_oborudovaniya *проектирование и монтаж металлоконструкций.
Ответить
ООО «ЭкоЮгСтройКлимат» готово выполнить любой сложности монтаж и ремонт профессионального оборудования в Волгограде, Волгоградской Области и регионах РФ. Главное, что отличает нашу компанию на рынке – это оперативность выполнения работ. Многолетний накопленный опыт (мы работаем с 2010 года) и собранный штат профессиональных мастеров – профессионалов своего дела, позволяет нам проводить обслуживание профессионального оборудования в кратчайшие сроки. С нами у вас не будет задержек в производстве, а договор на постоянное сотрудничество, заключаемый с нашими заказчиками, стабилизирует отношения и формирует доверие. Более подробную информацию вы можете найти по ссылкам на нашем сайте http://stroyklimat.ru34.com.
Ответить
Не пройдет listn. В listn перед закрывающей кавычкой пропущен backslash.
Ответить
Выбираете интернет магазин где недорого купить качественную мебель в г.Волгограде? Онлайн магазин "Где Мебель" в г.Волгограде http://gde-mebel.com/ всегда рад предоставить огромный выбор мебели от ведущих мебельных фабрик РФ и СНГ. Наш интернет магазин готов помочь вам выбрать такую мебель, которая бы идеально дополняла Ваш интерьер и в то же время не тяготила кошелёк. Обширный каталог мебели онлайн интернет-магазина в Волгограде http://gde-mebel.com/catalog/ очень большой. Наш интернет-магазин предлагает много мебели, и предоставляет Вам большой асортимент различной мебели под любые запросы. Онлайн нтернет-магазин «Где Мебель» г.Волгоград всегда готов Вам помочь! Приходите к нам!
Ответить
Спасибо, ток сделал в виде ассоциативного массива)) $bb_code = [ "#\\\n#is" => "<br />", "#\[b\](.+?)\[\/b\]#is" => "<b>\\1</b>", "#\[i\](.+?)\[\/i\]#is" => "<i>\\1</i>", "#\[u\](.+?)\[\/u\]#is" => "<span style='text-decoration:underline'>\\1</span>", ]; и foreach ($bb_code as $key => $value) { $str_search[] = $key; $str_replace[] = $value; } Так править и добавлять чуть удобнее))
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.