A volte può aversi l’esigenza di dover offrire agli utenti la facoltà di contribuire ai contenuti del sito (ad esempio mediante commenti). In queste circostanze, di solito, viene preclusa la possibilità di inserire codice HTML al fine di ridurre il rischio dello SPAM e, soprattutto, per prevenire situazioni pericolose (come, ad esempio, XSS).
In talune circostanze, tuttavia, è indispensabile offrire all’utente la possibilità di inserire contenuti ipertestuali (è impensabile, ad esempio, un forum in cui agli utenti venisse preclusa la possibilità di inserire link) e quindi diviene indispensabile trovare un sistema alternativo alla mera accettazione del codice HTML.
Una soluzione al problema è offerta, senza dubbio, dall’utilizzo del BBCode, un particolare tipo di markup da diversi anni utilizzato nelle principali applicazioni per la gestione di forum (come ad esempio phpBB e VBulletin).
Per chi fosse interessato ad introdurre l’utilizzo del BBCode nelle proprie applicazioni segnalo una serie di risorse interessanti che ne facilitano l’integrazione all’interno di progetti in PHP.
Indice
Script pronti all’uso per la gestione del BBCode in PHP
Class that parses BBCodes for PHP
Un’interessante classe che offre il supporto al classico markup del BBCode ed offre anche la possibilità di creare dei custom tags.
HTML_BBCodeParser2
Questa classe consente di effettuare con semplicità il parsing del markup BBCode convertendolo in (X)HTML.
NBBC: The New BBCode Parser
Questa classe open source svolge egregiamente il proprio compito di conversione da BBCode a (X)HTML Strict 1.0.
BBCode
Una sofisticata libreria – scritta in PHP – attraverso la quale sarà possibile gestire nelle proprie applicazioni l’integrazione di testo formattato mediante BBCode. Offre un markup particolarmente ricco che comprende, tra gli altri, la possibilità di contrassegnare blocchi di codice ed inserire video di YouTube.
Una semplice classe per convertire BBCode in HTML
Una semplice, ma utile, classe in grado di effettuare la conversione da BBCode ad HTML. Di seguito il codice da copiare e incollare del file bbCodeParser.class.php:
<?php
class BBCodeParser {
private $bbcode_patterns = [
'/\[b\](.*?)\[\/b\]/is' => '<strong>$1</strong>',
'/\[i\](.*?)\[\/i\]/is' => '<em>$1</em>',
'/\[u\](.*?)\[\/u\]/is' => '<u>$1</u>',
'/\[s\](.*?)\[\/s\]/is' => '<s>$1</s>',
'/\[url=(.*?)\](.*?)\[\/url\]/is' => '<a href="$1" target="_blank" rel="noopener noreferrer">$2</a>',
'/\[url\](.*?)\[\/url\]/is' => '<a href="$1" target="_blank" rel="noopener noreferrer">$1</a>',
'/\[img\](.*?)\[\/img\]/is' => '<img src="$1" alt="Image" />',
'/\[quote\](.*?)\[\/quote\]/is' => '<blockquote>$1</blockquote>',
'/\[code\](.*?)\[\/code\]/is' => '<pre><code>$1</code></pre>',
'/\[color=(#[0-9a-fA-F]{3,6})\](.*?)\[\/color\]/is' => '<span style="color: $1;">$2</span>',
'/\[size=([1-7])\](.*?)\[\/size\]/is' => '<span style="font-size: $1em;">$2</span>',
'/\[list\](.*?)\[\/list\]/is' => '<ul>$1</ul>',
'/\[list=1\](.*?)\[\/list\]/is' => '<ol>$1</ol>',
'/\[\*\](.*?)\n?/is' => '<li>$1</li>',
];
public function parse($text) {
// Escape HTML entities to prevent XSS
$text = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
// Convert newlines to <br> (except inside <pre> blocks)
$text = preg_replace("/(?!<pre>)(\r\n|\r|\n)(?!<\/pre>)/", "<br>", $text);
// Replace BBCode with HTML
foreach ($this->bbcode_patterns as $pattern => $replacement) {
$text = preg_replace($pattern, $replacement, $text);
}
return $text;
}
}
?>
Vediamo un semplice esempio di utilizzo:
<?php
$parser = new BBCodeParser();
$bbcode = "[b]Bold[/b] [i]Italic[/i] [u]Underline[/u] [url=https://example.com]Link[/url]";
echo $parser->parse($bbcode);
?>