аватар Автор: Сергей Касаткин | 27 марта 2014 13:28

Статьи / PHP /

Примеры функций обработки bb кода в PHP


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


Первый способ - замена bb кода, переносы и код! PHP


Данный способ предусматривает замену регулярными выражениями PHP специального bb кода. Предусматривает также и возможность обрезки слишком длинных слов, сокращение большого количества отступов и переносов, отображение программного кода (теги php и code) и многое другое.

Код PHP

<?php
// Функция обработки bbCode

function print_page($message)
{
  // Разрезаем слишком длинные слова
    $message = preg_replace_callback(
              "|([a-zа-я\d!]{35,})|i",
              "split_text",
              $message);    

  // Тэги - [code], [php]
  preg_match_all( "#\[php\](.+)\[\/php\]#isU", $message, $matches );
  $cnt = count( $matches[0] );

  for ( $i = 0; $i < $cnt; $i++ ) {
    $phpBlocks[] = '<div class="codePHP">'.highlight_string( $matches[1][$i], true ).'</div>';
    $uniqidPHP = '[php_'.uniqid('').']';
    $uniqidsPHP[] = $uniqidPHP;
    $message = str_replace( $matches[0][$i], $uniqidPHP, $message ); 
  }

  $spaces = array( ' ', "\t" );
  $entities = array( '&nbsp;', '&nbsp;&nbsp;&nbsp;&nbsp;' );

  preg_match_all( "#\[code\](.+)\[\/code\]#isU", $message, $matches );
  $cnt = count( $matches[0] );

  for ( $i = 0; $i < $cnt; $i++ ) {
    $codeBlocks[] = '<div class="code">'.nl2br( str_replace( $spaces, $entities, htmlspecialchars( $matches[1][$i] ) ) ).'</div>';
    $uniqidCode = '[code_'.uniqid('').']';
    $uniqidsCode[] = $uniqidCode;
    $message = str_replace( $matches[0][$i], $uniqidCode, $message ); 
  }

// обработка регулярными выражениями bb кодов
  $message = htmlspecialchars( $message );
  $message = preg_replace("#\[b\](.+)\[\/b\]#isU", '<b>\\1</b>', $message);
  $message = preg_replace("#\[i\](.+)\[\/i\]#isU", '<i>\\1</i>', $message);
  $message = preg_replace("#\[u\](.+)\[\/u\]#isU", '<u>\\1</u>', $message);
  $message = preg_replace("#\[quote\](.+)\[\/quote\]#isU",'<div class="quoteHead">Цитата</div><div class="quoteContent">\\1</div>',$message);
  $message = preg_replace("#\[quote=&quot;([- 0-9a-zа-яА-Я]{1,30})&quot;\](.+)\[\/quote\]#isU", '<div class="quoteHead">\\1 пишет:</div><div class="quoteContent">\\2</div>', $message);
  $message = preg_replace("#\[url\][\s]*([\S]+)[\s]*\[\/url\]#isU",'<a href="\\1" target="_blank">\\1</a>',$message);
  $message = preg_replace("#\[url[\s]*=[\s]*([\S]+)[\s]*\][\s]*([^\[]*)\[/url\]#isU",
                             '<a href="\\1" target="_blank">\\2</a>',$message);
  $message = preg_replace("#\[img\][\s]*([\S]+)[\s]*\[\/img\]#isU",'<img src="\\1" alt="" />',$message);
  $message = preg_replace("#\[color=red\](.+)\[\/color\]#isU",'<span style="color:#FF0000">\\1</span>',$message);
  $message = preg_replace("#\[color=green\](.+)\[\/color\]#isU",'<span style="color:#008000">\\1</span>',$message);
  $message = preg_replace("#\[color=blue\](.+)\[\/color\]#isU",'<span style="color:#0000FF">\\1</span>',$message);
  $message = preg_replace_callback("#\[list\]\s*((?:\[\*\].+)+)\[\/list\]#siU",'getUnorderedList',$message);
  $message = preg_replace_callback("#\[list=([a|1])\]\s*((?:\[\*\].+)+)\[\/list\]#siU", 'getOrderedList',$message);

// добавляем переносы строк
  $message = nl2br( $message);

  if ( isset( $uniqidCode ) ) $message = str_replace( $uniqidsCode, $codeBlocks, $message );
  if ( isset( $uniqidPHP ) ) $message = str_replace( $uniqidsPHP, $phpBlocks, $message );

// Возвращаем уже код с html вместо bb code
  return $message;
}

?>

Возможно, будут некоторые несоответствия с Вашей версией php, поэтому некоторые блоки кода можно выкинуть. Также можно наоборот, дополнить код Вашими bb-тегами!


Второй способ - bb код - массивы с заменами PHP


Данный способ решает одну простую задачу - замена по шаблону средствами регулярных выражений элементов bb кода из первого массива на html аналоги из второго массива.

Код PHP

<?php

function AddBB($var) {

        $search = array(
                '/\[b\](.*?)\[\/b\]/is',
                '/\[i\](.*?)\[\/i\]/is',
                '/\[u\](.*?)\[\/u\]/is',
                '/\[img\](.*?)\[\/img\]/is',
                '/\[url\](.*?)\[\/url\]/is',
                '/\[url\=(.*?)\](.*?)\[\/url\]/is'
                );

        $replace = array(
                '<strong>$1</strong>',
                '<em>$1</em>',
                '<u>$1</u>',
                '<img src="$1" />',
                '<a href="$1">$1</a>',
                '<a href="$1">$2</a>'
                );


        $var = preg_replace ($search, $replace, $var);
        return $var;
}

?>

На Ваш вкус и цвет можете дополнить своими тегами!

Третий способ - функция для парсинга bb кода с учетом http или без адресов в url и img


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:", $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;
}


Спасибо за внимание!
 



Похожие статьи


Комментарии к статье (vk.com)