23
bbcode
bbcode
SYNOPSIS
bbcode($s)
DESCRIPTION
bbcode retourne la conversion du balisage BBCode de la chaîne de caractères $s en HTML.
Les caractères spéciaux HTML sont protégés avant que les balises BBCode ne soient traitées.
Les blocs de code peuvent être colorés syntaxiquement avec GeSHi.
EXEMPLE
Pour convertir un balisage BBCode en HTML :
php > define('ROOT_DIR', __DIR__);
php > set_include_path(ROOT_DIR . DIRECTORY_SEPARATOR . 'includes' . PATH_SEPARATOR . get_include_path());
php > require 'library/bbcode.php';
php > $s='[p][b]iZend[/b] is available at [url]https://www.izend.org[/url].[/p]';
php > echo bbcode($s);
<p><b>iZend</b> is available at <a href="https://www.izend.org">https://www.izend.org</a>.</p>
CODE
- require_once 'geshi.php';
- function bbcode($s) {
- static $bbcode = array(
- '#\[br\]#is' => '<br />',
- // '#\[(h[4-6])\](.+?)\[/\1\]#is' => '<\1>\2</\1>',
- '#\[b\](.+?)\[/b\]#is' => '<b>\1</b>',
- '#\[i\](.+?)\[/i\]#is' => '<i>\1</i>',
- '#\[u\](.+?)\[/u\]#is' => '<u>\1</u>',
- '#\[s\](.+?)\[/s\]#is' => '<s>\1</s>',
- '#\[p\](.+?)\[/p\]#is' => '<p>\1</p>',
- '#\[pre\](.+?)\[/pre\]#is' => '<pre>\1</pre>',
- '#\[quote\](.+?)\[/quote\]#is' => '<blockquote>\1</blockquote>',
- // '#\[small\](.+?)\[/small\]#is' => '<span class="smaller">\1</span>',
- // '#\[big\](.+?)\[/big\]#is' => '<span class="larger">\1</span>',
- );
- $s = preg_replace_callback('#\[code([^\]]*?)\](.*?)\[/code\]#is', function ($m) { return '[code' . $m[1] . ']' . bbcode_protect($m[2]) . '[/code]'; }, $s);
- $s = htmlspecialchars($s, ENT_COMPAT, 'UTF-8');
- $s = preg_replace(array_keys($bbcode), array_values($bbcode), $s);
- $bbcode_cb = array(
- '#\[url\=(.+?)\](.*?)\[/url\]#is' => function($m) { return filter_var($m[1], FILTER_VALIDATE_URL) ? '<a href="' . $m[1] . '">' . $m[2] . '</a>' : $m[0]; },
- '#\[url](.*?)\[/url\]#is' => function($m) { return filter_var($m[1], FILTER_VALIDATE_URL) ? '<a href="' . $m[1] . '">' . $m[1] . '</a>' : $m[0]; },
- '#\[(e?mail)\=(.+?)\](.*?)\[/\1\]#is' => function($m) { return filter_var($m[2], FILTER_VALIDATE_EMAIL) ? '<a href="mailto:' . $m[2] .'">' . $m[3] . '</a>' : $m[0]; },
- '#\[(e?mail)\](.*?)\[/\1\]#is' => function($m) { return filter_var($m[2], FILTER_VALIDATE_EMAIL) ? '<a href="mailto:' . $m[2] .'">' . $m[2] . '</a>' : $m[0]; },
- '#\[code\=(.+?)\](.+?)\[/code\]#is' => function($m) { return bbcode_highlite($m[2], $m[1]); },
- '#\[code\](.+?)\[/code\]#is' => function($m) { return bbcode_highlite($m[1]); },
- );
- foreach ($bbcode_cb as $regexp => $f) {
- $s = preg_replace_callback($regexp, $f, $s);
- }
- return $s;
- }
- function bbcode_protect($s) {
- return base64_encode(preg_replace('#\\\"#', '"', $s));
- }
- function bbcode_highlite($s, $language=false) {
- $s = base64_decode($s);
- if (!$language) {
- return '<code>' . htmlspecialchars($s, ENT_COMPAT, 'UTF-8') . '</code>';
- }
- $geshi = new GeSHi($s, $language);
- $geshi->enable_classes(true);
- $geshi->set_header_type(GESHI_HEADER_DIV);
- $geshi->enable_keyword_links(false);
- $geshi->set_tab_width(4);
- $output = $geshi->parse_code();
- if ($geshi->error()) {
- return false;
- }
- head('stylesheet', 'geshi/' . $language, 'screen');
- return '<div class="geshi">' . $output . '</div>';
- }
Commentaires