BBCode с оцветяване на [code]
Тъй... доста време се мъчих да го напиша това :D Самият ББКод представлява един preg_replace, който заменя със <b> и </b> примерно - дотук нищо сложно ... Smile
И така ... понеже ще го напиша набързо може да не е изключително разбираемо, но ще отговарям на всякакви въпроси по него Smile

.....
Първо да направим формата за писане.
Представлява една текст-ареа и бутончета с малко JS.
Ето го JS-то :

function our(id_elem, text) {
x=document.getElementById(id_elem).value;
document.getElementById(id_elem).value = x +' '+text;
}

Функция, която взема текста от textarea-та и после го връща обратно, заедно със посочения в нея текст. Smile
След това си правим една textarea

<textarea id='test'></textarea>

Smile Сега слагаме покрай нея бутончета, които ще вкарват бб-кода в нея. Те са прости input-и със зададена функцията our() която направихме с JS-то горе.

<input onclick="javascript: our('textarea','')" type='button' value='B'>
<input onclick="javascript:our('textarea','[i][/i]')" type='button' value='i'>
<input onclick="javascript:our('textarea','[u][/u]')" type='button' value='u'>

И така нататък ... допишете си бутончета за [size], [color] , [img] и така нататък...
our('textarea','') задава на бутона да изведе в текстовото поле при натискане (не знам това има ли нужда да го обяснявам, но ... Smile )
И така ... да приемем, че сме добавили вече урока в базата данни и вече сме на фаза разглеждане.
И да речем, че сме взели съдържанието на урока в една променлива $lesson

$lesson = $row['lesson'];

Първото, което правим е да минем променливата през htmlspecialchars(); и nl2br(); ЗАДЪЛЖИТЕЛНО В ТОЗИ РЕД, а не обратното. Smile

$lesson = nl2br(htmlspecialchars($lesson));

И така... Следват 9 регулярни израза за всеки ббкод поотделно. Следното

$bbcode_regex = array(
0 => '/\[b\](.+?)\[\/b\]/s',
1 => '/\[i\](.+?)\[\/i\]/s',
2 => '/\[u\](.+?)\[\/u\]/s',
3 => '/\[quote\](.+?)\[\/quote\]/s',
4 => '/\[quote\=(.+?)](.+?)\[\/quote\]/s',
5 => '/\[url\](.+?)\[\/url\]/s',
6 => '/\[url\=(.+?)\](.+?)\[\/url\]/s',
7 => '/\[img\](.+?)\[\/img\]/s',
8 => '/\[color\=(.+?)\](.+?)\[\/color\]/s',
9 => '/\[size\=(.+?)\](.+?)\[\/size\]/s'
);
Гледах го десетина пъти, надявам се да е вярно.... И така - регулярните изрази не са лесно нещо, но изключително просто ще обясня, че (.+?) в нашият случай служи за вземане на какъвто и да е символен низ между съответните тагове.
/\\](.+?)\[\/b\]/s означава да се вземе какъвто и да е текст между и А многото \ са там защото ] [ и / са специални символи и трябва преди тях да се поставя \, за да не се приемат като команди в израза... Надявам се ме разбрахте. Взетият от между скобите текст (.+?) се присвоява на нещо като променлива $1, ако в същият израз имахме още едни скоби (.+?) (както е при size, color и url се получава и $2, защото там освен текста, трябва да вземем и това след равното (пр: [size=2]асд[/size] ).
И така след 9-те регулярни израза следва да напишем и това, с което ще се заместват. А то е :

$bbcode_replace = array(
0 => '<b>$1</b>',
1 => '<i>$1</i>',
2 => '<u>$1</u>',
3 => 'Цитат:<br/>$1',
4 => '$1 каза:$2',
5 => '<a href="$1">$1</a>',
6 => '<a href="$1">$2</a>',
7 => '<img src="$1" alt="Image"/>',
8 => '<span style="color:$1">$2</span>',
9 => '<span style="font-size:$1pt">$2</span>'
);

И така ... в 0 ограждаме текста от скобите $1 във <b> и </b>
Във 1 го ограждаме между <i> и </i>
Във 2 между <u> и </U>
Във 3 (ако няма [quote=edi koi si]) пишем думата Цитат : и поставяме цитата тук ($1)
Във 4 ако има [quote=...] Думата след равното ни е $1, а самият текст ни е $2 ( $1 каза : $2 )
И така нататък на същият принцип до края ... :)

Сега сортираме двата масива (с регулярните изрази и със заменките) чрез функцията ksort. В случая не е жизнено важна, но е добре да я има

ksort($bbcode_regex);
ksort($bbcode_replace);

И заменяме единият с другият масив

$lesson = preg_replace($bbcode_regex, $bbcode_replace, $lesson);

И така вече имаме целият урок със готов ббкод, но без таговете code и /code...
Помните ли, че в началото сложихме един nl2br, който направи всички нови редове на <br/>, за да се визуализират ? :) Сега обаче за тага code трябва да ги няма, защото функцията, която ще ползваме ще си сложи неини си <br/> и тези ще останат и ще се виждат. Момента е да си направим една функция за премахването им :

function br2nl($string)
{
return str_replace("<br />","",$string);
}

Изтриваме <br /> във зададения текст - нищо сложно :)
Така ... сега си правим функция, която ще обработи code-тата. Ето я и нея :

function code($s)
{
$s = str_replace("]\n", "]", $s);
$match = array('#\[code\](.*?)\[\/code\]#se');
$replace = array("highlight_string(htmlspecialchars_decode(br2nl(stripslashes('$1'))), true)");
return preg_replace($match, $replace, $s);
}

И така ... Какво прави фунцията. Подава и се един низ $s (целият урок) и какво прави тя...
Първо маха всички \n след ] скоба за затваряне на таг. Със един прост str_replace.
След това един регулярен израз взема съдържанията между code-тата.
Какво прави заменящият масив ?
Минава съдържанието между code и /code през няколко функции.
stripslashes(); маха наклонените черти преди кавички.
br2nl(); нашата функция от по-горе, с която махахме <br />-тата
htmlspecialchars_decode(); - функция обратна на htmlspecialchars();, която от < " итн ... връща обратно към нормални символи.
И highlight_string, която оцветява кода между <?php и ?> - затова беше нужно да използваме htmlspecialchars_decode();
Минаваме урока през тази функция

$lesson = code($lesson);

И вече имаме готови обработени code и /code
Сега остава само да визуализираме кода урока.

echo $lesson;

Това няма да го обяснявам
Mad Aко някой нещо не е разбрал да пита във форума - ако имам грешки ще ги оправям Smile
Успех Mad






/ Трябва да сте регистриран за да напишете коментар /
От: stylelife
9:38 22-09-2009
Брато много ми помогна тнх ман.
От: ivo_besen
16:19 07-06-2011
БРАВОООО СТРАХОТЕН УРОК
1