Вы, наверное, уже не раз сталкивались с конструкциями 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( ' ', ' ' );
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="([- 0-9a-zа-яА-Я]{1,30})"\](.+)\[\/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;
}
Спасибо за внимание!