BB-коды PHP


Поиск и замена (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-е.

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

Создаем BB коды на PHP

Для начала давай выясним что такое bb код. это нечто что позволяет превратить [url ]https://fapos.net[/url] в https://fapos.net . По сути BB коды это просто замена одного текста на другой по определенным правилам.

А теперь давай вспомним какая функция в PHP позволяет делать нам такие замены. Конечно же preg_replace(). Она работает по аналогии с str_replace, только принимает в качестве первого параметра, то есть что менять, регулярное выражение. Круто да? Вот как можно реализовать приведенный в начале пример BB кода при помощи этой функции

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

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

Безопасность
следует помнить что BB коды как правило приводят к появлению уязвимостей по-этому чтобы свести риск на минимум перед преобразованиями прогоняйте весь текст через квотящие функции, они не затронут квадратные скобки, то есть BB коды, но сведут на нет попытки взлома через BB коды. А так как сами бб коды будут преобразованы в HTML после, с ними все будет хорошо и они будут коректно работать. Примером такой «квотящей» функции может стать htmlspecialchars();

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


обратные BB-коды при эхо

Я нашел код для использования bb-кодов в своем личном сообщении в профилях, но когда я возвращаюсь к настройкам, чтобы изменить сообщение, он выводит html-теги вместо замены bb-кодов.

Эхо био в текстовой области:

Решение

Попробуйте эту функцию

s’ ); // BBcode array $replace = array( ‘[b]$1[/b]’, ‘[i]$1[/i]’, ‘[u]$1[/u]’, ‘

Другие решения

Это код, который я сейчас использую, чтобы повторить $row[‘bio’]

s’ ); // BBcode array $replace = array( ‘[b]$1[/b]’, ‘[i]$1[/i]’, ‘[u]$1[/u]’, ‘

BB код

Пояснение

BB коды — это набор тегов, основанных на языке HTML и разработанных специально для использования в сообщениях форума. Они позволяют выполнять форматирование текста гораздо проще, чем в HTML, причём не нарушая целостность страницы. Возможность использования BB кодов настраивается администратором индивидуально на каждый раздел форума, поэтому, прежде чем использовать BB коды в сообщениях, вы должны убедиться, что они разрешены.

Ниже приведены примеры использования BB кодов.

PHP BB Code to HTML script error

A friend of mine is using a bb script which echos normal text out into bb code. He has gave me the script but can’t seem to understand how to get it to work.

Here is the script


‘; > > $pattern = ‘#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#’; $callback = create_function(‘$matches’, ‘ $url = array_shift($matches); $text = preg_replace(«/^www./», «», $text); $text = $url; if (preg_match(«/\[/i», $url) || preg_match(«/\]/i», $url)) < return($url); >else< return sprintf(\'%s\', $url, $text); > ‘); $text = preg_replace_callback($pattern, $callback, $text); $text = preg_replace_callback(‘/\[code\](.*?)\[\/code\]/ms’, «escape», $text); // Smileys to find. $in = array( «:3:», «:@», «:bad:», «:'(«, «:eee:», «:error:», «:excited:», «:explode:», «:hey:», «:lol:», «:love:», «:magikarp:», «:ohnoes:», «:oo:», «:pika:», «:(«, «:suck:», «:loo:», «;)», «:wobby:», «:wobby2:», «:woo:», «:wtf:», «:yes:», «viewform?formkey=», «google.com/spreadsheet/», «tpsrpgo»,»tpmrpg»,»pkmnmoon»,»pokemonvortex»,»weebly»,»nsigma», «amp;» ); // And replace them by. $out = array( ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘
Ignore and report this message to Da Man!

‘, ‘
Ignore and report this message to Da Man!

    (.*?) /ms’, »

      \\1

    «, $text); $text = nl2br($text); $text = stripslashes($text); return $text; >

    so i input the text [b] hello [/b] in side the $text at the top and get nothing after the script i echo it out like so

    But i get no print out. if i just print out the $text = $poke1[‘status’]; it will print out but only has normal text e.g [b] hello [/b]

    простейший редактор 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 .

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

    BB-коды PHP

    Здесь могла бы быть ваша реклама

    Покинул форум
    Сообщений всего: 4574
    Дата рег-ции: Июль 2006
    Откуда: Israel

    Секрет
    Теперь, когда вы уже наверняка второпях отправили свой запрос,
    я расскажу вам простой секрет, который сэкономит вам уйму ожиданий,
    даже если первый ответ по теме последуем сразу же.

    Само собой я знаю что ответят мне тут же, и если я посмотрю
    на сообщения на форуме, то пойму что в общем то я и не ошибаюсь.
    Но еще я точно замечу, что очень мало тем, в которых всего два ответа :
    вопрос автора и еще два сообщение вида Ответ + Спасибо


    После этого приходится начинать уточнять этим неграмотным что мне надо.
    Они что, сами читать не умеют? А уточнять приходится.
    И иногда пока они переварят то что я им скажу проходит и не одна ночь..

    Уверен что если бы я им сказал что у меня есть
    фиолетовый квадрат, и нужно превратить его в синий треугольник
    и я пытался взять кисточку, макнуть в банку и поводить ей по квадрату
    но почему то кисточка не принимала цвет краски в банке,
    то на мой вопрос — где взять правильные банки мне бы ответили гораздо быстрее
    предложив её открыть, а не тратить еще стольник на жестянку.

    Поэтому с тех пор я строю свои вопросы по проверенной давным давно схеме:
    Что есть
    Что нужно получить
    Как я пытался
    Почему или что у меня не получилось.

    На последок как оно происходит на форумах

    Новичок: Подскажите пожалуста самый крепкий сорт дерева! Весь инет перерыл, поиском пользовался!
    Старожил: Объясни, зачем тебе понадобилось дерево? Сейчас оно в строительстве практически не используется.
    Новичок: Я небоскрёб собираюсь строить. Хочу узнать, из какого дерева делать перекрытия между этажами!
    Старожил: Какое дерево? Ты вообще соображаешь, что говоришь?
    Новичок: Чем мне нравиться этот форум — из двух ответов ниодного конкретного. Одни вопросы неподелу!
    Старожил: Не нравится — тебя здесь никто не держит. Но если ты не соображаешь, что из дерева небоскрёбы не строят, то лучше бы тебе сначала школу закончить.
    Новичок: Не знаите — лучше молчите! У меня дедушка в деревянном доме живёт! У НЕГО НИЧЕГО НЕ ЛОМАЕТСЯ.
    Но у него дом из сосны, а я понимаю, что для небоскрёба нужно дерево прочнее! Поэтому и спрашиваю. А от вас нормального ответа недождёшся.
    Прохожий: Самое крепкое дерево — дуб. Вот тебе технология вымачивания дуба в солёной воде, она придаёт дубу особую прочность:
    Новичок: Спасибо, братан! То что нужно.

    Отредактировано модератором: Uchkuma, 26 Апреля, 2011 — 10:21:12

    Добавляем свои BB-коды через bbcode.php

    Добавляем свои BB-коды через bbcode.php

    Добавляем свои BB-коды через bbcode.php

    Добавляем свои BB-коды через bbcode.php

    php Код: Выделить всё Развернуть case 12 :
    $this -> bbcode_cache [ $bbcode_id ] = array (
    ‘str’ => array (
    ‘[/attachment:$uid]’ => $this -> bbcode_tpl ( ‘inline_attachment_close’ , $bbcode_id )
    ),
    ‘preg’ => array (
    ‘#\[attachment=([0-9]+):$uid\]#’ => $this -> bbcode_tpl ( ‘inline_attachment_open’ , $bbcode_id )
    )
    );
    break ;

    php Код: Выделить всё Развернуть /*— StartMod: EddBBCode [strong] ——————————————————-*/
    case 13 :
    $this -> bbcode_cache [ $bbcode_id ] = array (
    ‘str’ => array (
    ‘[strong:$uid]’ => $this -> bbcode_tpl ( ‘strong_open’ , $bbcode_id ),
    ‘[/strong:$uid]’ => $this -> bbcode_tpl ( ‘strong_close’ , $bbcode_id ),
    )
    );
    break ;
    /*— EndMod: EddBBCode [strong] ——————————————————-*/

    /*— StartMod: EddBBCode [s] ——————————————————-*/
    case 14 :
    $this -> bbcode_cache [ $bbcode_id ] = array (
    ‘str’ => array (
    ‘[s:$uid]’ => $this -> bbcode_tpl ( ‘s_open’ , $bbcode_id ),
    ‘[/s:$uid]’ => $this -> bbcode_tpl ( ‘s_close’ , $bbcode_id ),
    )
    );
    break ;
    /*— EndMod: EddBBCode [s] ——————————————————-*/

    /*— StartMod: EddBBCode [tt] ——————————————————-*/
    case 15 :
    $this -> bbcode_cache [ $bbcode_id ] = array (
    ‘str’ => array (
    ‘[tt:$uid]’ => $this -> bbcode_tpl ( ‘tt_open’ , $bbcode_id ),
    ‘[/tt:$uid]’ => $this -> bbcode_tpl ( ‘tt_close’ , $bbcode_id ),
    )
    );
    break ;
    /*— EndMod: EddBBCode [tt] ——————————————————-*/

    /*— StartMod: EddBBCode [kbd] ——————————————————-*/
    case 16 :
    $this -> bbcode_cache [ $bbcode_id ] = array (
    ‘str’ => array (
    ‘[kbd:$uid]’ => $this -> bbcode_tpl ( ‘kbd_open’ , $bbcode_id ),
    ‘[/kbd:$uid]’ => $this -> bbcode_tpl ( ‘kbd_close’ , $bbcode_id ),
    )
    );
    break ;
    /*— EndMod: EddBBCode [kbd] ——————————————————-*/

    Код: Выделить всё Развернуть $bbcode_hardtpl = array(


    И добавить ниже:

    Смотрим что бы ID bb-кода не совпадало с предыдущим или существующим — заданным в Панели.
    Если у вас уже есть добавленные через ПУ BB коды, нужно быдет изменить их ID в базе.
    Для этого заходим в phpMyAdmin открываем таблицу phpbb_bbcodes и изменяем ID всех совпавших бб кодов, так, что бы они не совпадали с добавляемыми.

    php Код: Выделить всё Развернуть ‘b’ => array ( ‘bbcode_id’ => 1 , ‘regexp’ => array ( ‘#\[b\](.*?)\[/b\]#uise’ => «\$this->bbcode_strong(‘\$1’)» )),

    php Код: Выделить всё Развернуть ‘b’ => array ( ‘bbcode_id’ => 1 , ‘regexp’ => array ( ‘#\[b\](.*?)\[/b\]#uise’ => «\$this->bbcode_bold(‘\$1’)» )),

    php Код: Выделить всё Развернуть ‘u’ => array ( ‘bbcode_id’ => 7 , ‘regexp’ => array ( ‘#\[u\](.*?)\[/u\]#uise’ => «\$this->bbcode_underline(‘\$1’)» )),

    php Код: Выделить всё Развернуть /**
    * Parse b tag
    */
    function bbcode_strong ( $in )
    <
    if (! $this -> check_bbcode ( ‘b’ , $in ))
    <
    return $in ;
    >

    return ‘[b:’ . $this -> bbcode_uid . ‘]’ . $in . ‘[/b:’ . $this -> bbcode_uid . ‘]’ ;
    >

    php Код: Выделить всё Развернуть /**
    * Parse b tag
    */
    function bbcode_bold ( $in )
    <
    if (! $this -> check_bbcode ( ‘b’ , $in ))
    <
    return $in ;
    >

    return ‘[b:’ . $this -> bbcode_uid . ‘]’ . $in . ‘[/b:’ . $this -> bbcode_uid . ‘]’ ;
    >

    И добавить ниже:

    php Код: Выделить всё Развернуть /**
    * Parse strong tag
    */
    function bbcode_strong ( $in )
    <
    if (! $this -> check_bbcode ( ‘strong’ , $in ))
    <
    return $in ;
    >

    return ‘[strong:’ . $this -> bbcode_uid . ‘]’ . $in . ‘[/strong:’ . $this -> bbcode_uid . ‘]’ ;
    >

    /**
    * Parse s tag
    */
    function bbcode_strikethrough ( $in )
    <
    if (! $this -> check_bbcode ( ‘s’ , $in ))
    <
    return $in ;
    >

    return ‘[s:’ . $this -> bbcode_uid . ‘]’ . $in . ‘[/s:’ . $this -> bbcode_uid . ‘]’ ;
    >

    /**
    * Parse tt tag
    */
    function bbcode_teletype ( $in )
    <
    if (! $this -> check_bbcode ( ‘tt’ , $in ))
    <
    return $in ;
    >

    // This ugly hardcode taken from the bbcode_code
    $htm_match = get_preg_expression ( ‘bbcode_htm’ );
    unset ( $htm_match [ 4 ], $htm_match [ 5 ]);
    $htm_replace = array ( ‘\1’ , ‘\1’ , ‘\2’ , ‘\1’ );
    $in = preg_replace ( $htm_match , $htm_replace , $in );


    return ‘[tt:’ . $this -> bbcode_uid . ‘]’ . str_replace (array( ‘[‘ , ‘]’ , ‘ ‘ , «\t» ), array ( ‘[‘ , ‘]’ , ‘ ‘ , ‘ ‘ ), $in ) . ‘[/tt:’ . $this -> bbcode_uid . ‘]’ ;
    >

    /**
    * Parse kbd tag
    */
    function bbcode_keyboard ( $in )
    <
    if (! $this -> check_bbcode ( ‘kbd’ , $in ))
    <
    return $in ;
    >

    return ‘[kbd:’ . $this -> bbcode_uid . ‘]’ . $in . ‘[/kbd:’ . $this -> bbcode_uid . ‘]’ ;
    >

    php Код: Выделить всё Развернуть var bbtags = new Array ( ‘[b]’ , ‘[/b]’ , ‘[i]’ , ‘[/i]’ , ‘[u]’ , ‘[/u]’ , ‘[quote]’ , ‘[/quote]’ , ‘[code]’ , ‘[/code]’ , ‘[list]’ , ‘[/list]’ , ‘[list=]’ , ‘[/list]’ , ‘[img]’ , ‘[/img]’ , ‘[url]’ , ‘[/url]’ , ‘[flash=]’ , ‘[/flash]’ , ‘[size=]’ , ‘[/size]’

    Добавить в строку:

    php Код: Выделить всё Развернуть input type = «button» class = «button2» accesskey = «b» name = «addbbcode0″ value = » B » style = «font-weight:bold; width: 30px» onclick = «bbstyle(0)» title = «» />
    input type = «button» class = «button2» accesskey = «i» name = «addbbcode2″ value = » i » style = «font-style:italic; width: 30px» onclick = «bbstyle(2)» title = «» />
    input type = «button» class = «button2» accesskey = «u» name = «addbbcode4″ value = » u » style = «text-decoration: underline; width: 30px» onclick = «bbstyle(4)» title = «» />

    php Код: Выделить всё Развернуть input type = «button» class = «button2» accesskey = «b» name = «addbbcode0″ value = » B » style = «font-weight:bold; width: 30px» onclick = «bbstyle(0)» title = «» />
    input type = «button» class = «button2» accesskey = «g» name = «addbbcode22″ value = » strong » style = «font-weight:bold; width: 30px» onclick = «bbstyle(22)» title = «» />
    input type = «button» class = «button2» accesskey = «i» name = «addbbcode2″ value = » i » style = «font-style:italic; width: 30px» onclick = «bbstyle(2)» title = «» />
    input type = «button» class = «button2» accesskey = «u» name = «addbbcode4″ value = » u » style = «text-decoration: underline; width: 30px» onclick = «bbstyle(4)» title = «» />
    input type = «button» class = «button2» accesskey = «s» name = «addbbcode24″ value = » s » style = «text-decoration:line-through; width: 30px» onclick = «bbstyle(24)» title = «» />
    input type = «button» class = «button2» accesskey = «t» name = «addbbcode26″ value = » tt » style = «font:1.2em/1em monospace; width: 30px» onclick = «bbstyle(26)» title = «» />
    input type = «button» class = «button2» accesskey = «k» name = «addbbcode28″ value = » kbd » style = «font:1.2em/1em monospace; width: 30px» onclick = «bbstyle(28)» title = «» />

    php Код: Выделить всё Развернуть ‘BBCODE_U_HELP’ => ‘Подчёркнутый текст: [u]text[/u]’ ,

    php Код: Выделить всё Развернуть ‘BBCODE_STRIKE_HELP’ => ‘Зачёркнутый текст: [s]текст[/s]’ ,
    ‘BBCODE_TT_HELP’ => ‘Моноширный шрифт: [tt]текст[/tt]’ ,
    ‘BBCODE_STRONG_HELP’ => ‘Выделенный текст: [strong]текст[/strong]’ ,
    ‘BBCODE_KBD_HELP’ => ‘Сочетания клавиш: [kbd]текст[/kbd]’ ,

    php Код: Выделить всё Развернуть ‘BBCODE_U_HELP’ => ‘Underline text: [u]text[/u]’ ,

    php Код: Выделить всё Развернуть ‘BBCODE_STRIKE_HELP’ => ‘Strikethrough text: [s]text[/s]’ ,
    ‘BBCODE_TT_HELP’ => ‘Monospaced font: [tt]text[/tt]’ ,
    ‘BBCODE_STRONG_HELP’ => ‘Bold text: [strong]text[/strong]’ ,
    ‘BBCODE_KBD_HELP’ => ‘Keyboard shortcuts text: [kbd]text[/kbd]’ ,

    php Код: Выделить всё Развернуть $num_predefined_bbcodes = 22 ;

    php Код: Выделить всё Развернуть $num_predefined_bbcodes = 30 ;

    Где:
    30 == 22 + количество добавленных кодов * 2;
    30 == 22 + 4*2

    Сохранить, обновить шаблоны, сбросить кеш и юзать.
    Стили и прочее по вкусу.

    PHP BB Code to HTML script error


    A friend of mine is using a bb script which echos normal text out into bb code. He has gave me the script but can’t seem to understand how to get it to work.

    Here is the script

    ‘; > > $pattern = ‘#\b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))#’; $callback = create_function(‘$matches’, ‘ $url = array_shift($matches); $text = preg_replace(«/^www./», «», $text); $text = $url; if (preg_match(«/\[/i», $url) || preg_match(«/\]/i», $url)) < return($url); >else< return sprintf(\'%s\', $url, $text); > ‘); $text = preg_replace_callback($pattern, $callback, $text); $text = preg_replace_callback(‘/\[code\](.*?)\[\/code\]/ms’, «escape», $text); // Smileys to find. $in = array( «:3:», «:@», «:bad:», «:'(«, «:eee:», «:error:», «:excited:», «:explode:», «:hey:», «:lol:», «:love:», «:magikarp:», «:ohnoes:», «:oo:», «:pika:», «:(«, «:suck:», «:loo:», «;)», «:wobby:», «:wobby2:», «:woo:», «:wtf:», «:yes:», «viewform?formkey=», «google.com/spreadsheet/», «tpsrpgo»,»tpmrpg»,»pkmnmoon»,»pokemonvortex»,»weebly»,»nsigma», «amp;» ); // And replace them by. $out = array( ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘ ‘, ‘
    Ignore and report this message to Da Man!

    ‘, ‘
    Ignore and report this message to Da Man!

      (.*?) /ms’, »

        \\1

      «, $text); $text = nl2br($text); $text = stripslashes($text); return $text; >

      so i input the text [b] hello [/b] in side the $text at the top and get nothing after the script i echo it out like so

      But i get no print out. if i just print out the $text = $poke1[‘status’]; it will print out but only has normal text e.g [b] hello [/b]

      Php BB коды

      Php начинающим

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

    Ответить Новая тема
    BB код Преобразование Описание
    [ b ] что-то здесь [ /b ] что-то здесь жирный текст
    [ i ] что-то здесь [ /i ] что-то здесь наклонный текст
    [ u ] что-то здесь [ /u ] что-то здесь подчеркнутый текст
    [ q ] что-то здесь [ /q ]
    что-то здесь
    выделенная цитата
    [ list ] что-то здесь [ /list ]
    • что-то здесь
    не нумерованный список
    [ listn ] что-то здесь [ /listn ]
    1. что-то здесь
    нумерованный список
    (url)что-то здесь (/url) » » >что-то здесь Url ссылка

    Ранее в разделе Php база, мы научились с Вами сохранять данные в таком формате, чтобы он не причинил вреда при выводе его из базы в html текст, теперь будем добавлять BB коды, а потом их преобразовывать в html. Пользователю, которого мы лишили html форматирования, теперь становится интереснее. Но, как обычно, в любом начинании есть проблемы.
    Одна из проблем в том, что пользователь может забыть закрыть тег, или, ещё хуже, какой-нибудь нехороший пользователь специально захочет Вам навредить. Так вот, как найти парные теги в сообщении полученном из формы, которое пользователь послал в Гостевую книгу или в Форум? Дело в том, что если у Вас простая Гостевая, это не требуется, но если есть BB коды, это становится актуально, ведь потом эти парные теги мы будем заменять на их html эквиваленты:

    К примеру:
    [ b ] что-то здесь [ /b ] , посланное пользователем, преобразуется в
    что-то здесь, в этих BB кодах


    Теперь представьте, что пользователь по ошибке или специально открыл только один тег
    [ b ] что-то здесь, а закрыть тег не захотел, то получится:
    что-то здесь, а закрыть тег не захотел, то получится

    То есть, надо проверять парность тегов:
    — убирать в начале текста закрывающийся тег [ /b ] ;
    — убирать в конце текста открывающийся тег [ b ] ;
    — убирать пустые парные теги [ b ] [ /b ] ;
    — убирать повторяющиеся теги [ b ] [ b ] или [ /b ] [ /b ] ;

    Создадим такую функцию и посмотрим как она работает:

    # функция, которая убирает мусор в парных тегах
    function Teg ( $on e , $teg , $to o , $path ) <
    $on = preg_quote ( $on e ,»

    «);
    $saerch1 = preg_quote ( $on e ,»

    «) . $teg . preg_quote ( $to o ,»

    «);
    $saerch2 = preg_quote ( $on e ,»

    «,» «, $path );
    $path = trim ( $path );
    $path = preg_replace

    «, $on e . $teg . $to o , $path );
    $path = preg_replace

    «, $on e .»/». $teg . $to o , $path );
    $path = preg_replace

    U»;
    $search = array ();
    if ( preg_match_all ( $_search , $path , $array , PREG_PATTERN_ORDER)) <
    while ( list (, $val ) = each ( $array [ 0 ] )) <
    $content = «

    U»;
    if ( !empty ( $search [ 0 ] )) < if ( $content == $search [ 0 ] ) < continue; > >
    if ( @array_search ( $content , $search )) < continue; >
    $search [ ] = $content ;
    $pp = preg_replace

    «. $on .» [ / ] ?». $teg . $to .»

    e»;
    $replace [ ] = «0»;
    $path = preg_replace ( $search , $replace , $path );
    $path = preg_replace

    «. $on .»( [ / ] ?)». $teg . $to .» [ ] ?». $on .»\\1″. $teg . $to .»

    s», $on e .»\\1″. $teg . $to o , $path );
    >
    if ( !preg_match ( $_search , $path )) < $path = preg_replace


    «. $on .» [ / ] ?». $teg . $to .»

    # строка с плохими парными тегами
    $string = » [ /b ] [ /b ] [ /b ] [ b ] Проб [ b ] у [ b ] [ b ] ем [ /b ] Обм [ b ] ан [ b ] уть [ b ] Програ [ /b ] [ /b ] [ /b ] мму [ b ] [ b ] [ b ] «;
    echo $string .»\n

    # применим функцию по сбору мусора
    # в ней четыре аргумента: первые три показывают
    # какой тег проверяем, а последний где проверяем
    $string = Teg (» [ «,»b»,» ] «, $string );
    echo $string ;

    В итоге работы программы получим:

    [ /b ] [ /b ] [ /b ] [ b ] Проб [ b ] у [ b ] [ b ] ем [ /b ] Обм [ b ] ан [ b ] уть [ b ] Програ [ /b ] [ /b ] [ /b ] мму [ b ] [ b ] [ b ]

    [ b ] Пробуем [ /b ] Обм [ b ] ануть Програ [ /b ] мму

    То есть, в базу, при таком подходе мы запишем только парные теги. Вы скажете зачем всё это надо, но одно дело когда, например не закрылся тег [ b ] , ещё пол беды (весь тест далее будет выделен жирным шрифтом), и совсем другое когда не закрылся [ q ] , который мы будем преобразовывать в начало таблицы

    (представляете, что будет на странице при выводе такого не закрытого тега).

    То есть, теперь подведем итог:
    Пользователь послал сообщение $message , которое мы будем записывать в базу, как убрать html дескрипторы из сообщения мы знаем (раздел Php база), теперь оставим парные и уберем пустые теги BB кодов:

    // оставим парные и уберем пустые теги
    $message = Teg ( » [ » , » b » , » ] » , $message );
    $message = Teg ( » [ » , » i » , » ] » , $message );
    $message = Teg ( » [ » , » u » , » ] » , $message );
    $message = Teg ( » [ » , » q » , » ] » , $message );
    $message = Teg ( » [ » , » list » , » ] » , $message );
    $message = Teg ( » [ » , » listn » , » ] » , $message );
    $message = Teg ( » ( » , » url » , » ) » , $message );
    // записываем сообщение в базу
    $fp = fopen ( » Base.dat » , » a » );
    fputs ( $fp , » $message \n » );
    fclose ( $fp );
    ?>

    При таком подходе, мы оставляем мало шансов злоумышленнику навредить нам, и даем дополнительные возможности добросовестному пользователю по использованию html разметки в своих сообщениях.

    Страница: 1
    Аноним добавлено: 02.06.2011 20:34 сообщение № 9
    cncvn

    ДЕМОН добавлено: 12.04.2011 13:54 сообщение № 8
    полная хрень! можно сделать проще. нужно заменять bb-коды не по одному, а парами. ищем текст между парным bb-кодом и заменяем соответствующей комбинацией. а плохие bb-коды пускай так и остаются bb-кодами.

    Цитата:
    убирать в начале текста закрывающийся тег [ _/b ] ;

    во первых: нахрена?
    во вторых: [ _/b ] это не тег, это bb-код, и навредить он не может.

    в результате текст » [ _/b ] 1 [ _b ] 2 [ _b ] 3 [ _/b ] 4 [ _/b ] » превратиться в » [ _/b ] 1 2 [ _b ] 3 4 [ _/b ] » , т.е. нежелательные bb-коды будут частью текста (они не будут превращены в теги).

    chessnokk добавлено: 18.03.2010 12:45 сообщение № 7
    Warning: preg_replace () [ function.preg-replace ] : Compilation failed: nothing to repeat at offset 0 in D:\Program files\VertrigoServ\www\studline\function\teg.php on line 12


    Далер добавлено: 31.07.2009 23:06 сообщение № 6
    sd dsdas bb fff

    если вести такую строку то будет
    sd
    dsdas bb fff

    1 тег не закрыт — ошибочка

    и ешё выдаёт Notice на 19 строке — Offset.

    MSW Николаев добавлено: 08.06.2009 17:49 сообщение № 5
    если ввести коды

    [ _b ] [ _s ] [ _/s ] [ _/b ]

    то на самом деле генерится такое:

    Цитата:

    в чём может быть проблема?! 🙁

    Ответ: естественно теги, что привел не рассчитаны на все случаи жизни.

    Леся добавлено: 28.04.2009 01:25 сообщение № 4
    Искала подобную статью по всему инету, а нашла как всегда у вас. Спасибо! %tashus%

    Ответ:

    a1card Москва добавлено: 22.01.2009 16:29 сообщение № 3
    Отличная статья как раз то, что было нужно, чтобы закончить делать сайт.

    Ответ:

    Антон Павловский Посад добавлено: 29.11.2007 10:13 сообщение № 2
    # декодирование биби-кодов
    function bbcode( $sourse ) <

    $bb [ ] = » #\ [ b\ ] (.*?)\ [ /b\ ] #si » ;
    $html [ ] = » \\1 » ;
    $bb [ ] = » #\ [ i\ ] (.*?)\ [ /i\ ] #si » ;
    $html [ ] = » \\1 » ;
    $bb [ ] = » #\ [ u\ ] (.*?)\ [ /u\ ] #si » ;
    $html [ ] = » \\1 » ;
    $bb [ ] = » #\ [ s\ ] (.*?)\ [ /s\ ] #si » ;
    $html [ ] = » \\1 » ;
    $bb [ ] = » #\ [ li\ ] #si » ;
    $html [ ] = »
    » ;
    $bb [ ] = » #\ [ hr\ ] #si » ;
    $html [ ] = » » ;

    $sourse = preg_replace ( $bb , $html , $sourse );
    return $sourse ;
    >

    давно не спал, удалил нужное ))) вот рабочий пример

    Мастер Йода рекомендует:  Изучение языка программирования PHP
    Добавить комментарий