Du bbcode au (x)html

Soyez le premier à donner votre avis sur cette source.

Snippet vu 17 437 fois - Téléchargée 29 fois

Contenu du snippet

Ce code permet d'utiliser du bbcode à la place du HTML, pour des raisons de sécurité et de simplicité pour les utilisateurs :)
Merci de noter que c'est mon premier code sur phpcs ^__^' (voir tout premier code publié <__<')
Pensez bien à prendre les balises <style></style> (configuration modifiable à souhait)

Merci de signaler si vous voyez d'autres balises à ajouter dans les commentaires si il le faut :-)

Source / Exemple :


<style>
.code {
	border: 1px solid #657985;
	padding-left: 10px;
	background-color:#d3dbdf;
}

.quote {
	border: 1px dotted #657985;
	padding-left: 10px;
	background-color:#eeeeee;
}
</style>
<?php
//By Talus
function parse_css($texte) {
	$texte[1] = html_entity_decode($texte[1], true);
	
	$texte[1] = preg_replace('`((.*)(:)(.*)(;))+`x','<span style="color: navy;">$2</span><span style="color: fuchsia;">$3</span><span style="color: blue;">$4</span><span style="color: fuchsia;">$5</span>', $texte[1]);
		   
	$texte[1] = preg_replace('`((.*) \n? {)`x','<span style="color: fuchsia;">$1</span>', $texte[1]);
	$texte[1] = preg_replace('`(/\*(.*)\*/)`xs','<span style="color: gray;">$1</span>', $texte[1]);
	$texte[1] = str_replace('}','<span style="color: fuchsia;">}</span>', $texte[1]);
	
	$texte[1] = preg_replace('`<span style="color: (.*);">(.*)</span>`sU', '<span style="color:$1">[color=$1]$2/color</span>',$texte[1]);
			
	$texte[1] = str_replace('\n','', $texte[1]);
	$texte[1] = preg_replace('`(/\*\n?(.*)\n?\*/)`xsU','', $texte[1]);
	
	return '<br /><strong>Code CSS</strong> :<br /><div class="code">' . $texte[1] . '</div><br />';
}
function php_code($code){ //Colorisation de Code PHP
    return '<br /><div class="code_top">Script PHP :</div><div class="code_main">' . highlight_string(html_entity_decode($code[1]), true) . '</div><br />';
}
function forum_code($chaine,$xhtml = FALSE ){ 
	/* Paramètre autorisant (ou non) le HTML dans la chaine $chaine, et autorisant les sauts de lignes*/
	$chaine = nl2br(!$xhtml ? htmlentities($chaine) : $chaine);

	// Bloc des balises [url]-/url
	$chaine = preg_replace('`\[url=([http://].+?)](.+?)\/url`si','<a href="#" onclick="window.open(\'$1\',\'popup\');" title="$1">$2</a>',$chaine); 
	$chaine = preg_replace('`\[url=(.+?)](.+?)\/url`si','<a href="#" onclick="window.open(\'http://$1\',\'popup\');" title="$1">$2</a>',$chaine); 
	$chaine = preg_replace('`\[url]([http://].+?)\/url`si','<a href="#" onclick="window.open(\'$1\',\'popup\');" title="$1">$1</a>',$chaine); 
	$chaine = preg_replace('`\[url](.+?)\/url`si','<a href="#" onclick="window.open(\'http://$1\',\'popup\');" title="$1">$1</a>',$chaine); 
	     
	// Bloc des balises [b]-/b
	$chaine = preg_replace('#\[b](.+?)\/b#si','<strong>$1</strong>',$chaine); 
	
	// Bloc des balises [u]-/u
	$chaine = preg_replace('#\[u](.+?)\/u#si','<span style="text-decoration:underline;">$1</span>',$chaine);
	
	// Bloc des balises [i]-/i
	$chaine = preg_replace('#\[i](.+?)\/i#si','<em>$1</em>',$chaine);
	
	// Bloc des balises [strike]-/strike
	$chaine = preg_replace('#\[strike](.+?)\/strike#si','<span style="text-decoration:line-through;">$1</span>',$chaine); 
	
	// Bloc des balises [overline]-/overline
	$chaine = preg_replace('#\[overline](.+?)\/overline#si','<span style="text-decoration:overline;">$1</span>',$chaine); 
	
	// Bloc des balises [code]-/code
	$chaine = preg_replace('#\[code](.+?)\/code#si','<br /><strong>div :</strong> :<br /><div class="div">$1</div><br />',$chaine);
	$chaine = preg_replace_callback('#\[code=css](.+?)\/code#si','parse_css',$chaine);	
	$chaine = preg_replace_callback('#\[code=php](.+?)\/code#si','php_code',$chaine);
	
	// Bloc des balises [quote]-/quote
	$chaine = preg_replace('#\[quote=me](.+?)\/quote#si','<br /><strong>J\'ai écrit</strong> :<br/><div class="quote">$1 </div><br />',$chaine); 
	$chaine = preg_replace('#\[quote=(.+?)](.+?)\/quote#si','<br /><strong>$1 a écrit</strong> :<br/><div class="quote">$2 </div><br />',$chaine); 
	$chaine = preg_replace('#\[quote](.+?)\/quote#si','<br /><strong>Citation</strong> :<br/><div class="quote">$1 </div><br />',$chaine); 
	
	// Bloc des balises [img]-/img
	$chaine = preg_replace('#\[img=(.+?)](.+?)\/img#si','<img src="$1" border="0" alt="$2" />',$chaine);
	$chaine = preg_replace('#\[img](.+?)\/img#si','<img src="$1" border="0" />',$chaine);
	
	// Bloc des balises [mail]-/mail
	$chaine = preg_replace('#\[mail=([mailto:].+?)](.+?)\/mail#si','<a href="$1">$2</a>',$chaine); 
	$chaine = preg_replace('#\[mail=(.+?)](.+?)\/mail#si','<a href="mailto:$1">$2</a>',$chaine); 
	$chaine = preg_replace('#\[mail]([mailto:].+?)\/mail#si','<a href="$1">$1</a>',$chaine); 
	$chaine = preg_replace('#\[mail](.+?)\/mail#si','<a href="mailto:$1">$1</a>',$chaine); 
	
	// Bloc des balises [align]-/align
	$chaine = preg_replace('#\[align=(left|center|right)](.+?)\/align#si','<div style="text-align:$1; width:100%;">$2</div>',$chaine); 
	
	// Bloc des balises [color]-/color
	$chaine = preg_replace('#\[color=(.+?)](.+?)\/color#si','<span style="color:$1;">$2</span>',$chaine); 
	
	// Bloc des balises [size]-/size
	$chaine = preg_replace('#\[size=([0-9]{1,2})](.+?)\/size#si','<span style="font-size:$1px;">$2</span>',$chaine); 
	
	// Bloc des balises [thick]-/thick
	$chaine = preg_replace('#\[thick=([0-9]{1,3})](.+?)\/thick#si','<span style="font-weight:$1px;">$2</span>',$chaine); 
	
	// Bloc des balises [style]-/style
	$chaine = preg_replace('#\[style=(normal|italique|oblique)](.+?)\/style#si','<span style="font-style:$1;">$2</span>',$chaine); 
	
	// Bloc des balises [weight]-/weight
	$chaine = preg_replace('#\[weight=(lighter|bold|bolder)](.+?)\/weight#si','<span style="font-weight:$1;">$2</span>',$chaine); 
	
	// Bloc des balises [decoration]-/decoration
	$chaine = preg_replace('#\[decoration=(underline|line-through|overline|blink)](.+?)\/decoration#si','<span style="font-weight:$1;">$2</span>',$chaine); 
	
	// Bloc des balises [font]-/font
	$chaine = preg_replace('#\[font=(.+?)](.+?)\/font#si','<span style="font-family:$1;">$2</span>',$chaine);

	// Bloc des balises [list]-/list
	$chaine = preg_replace('`\[list=(circle|disc|square|i)](.+?)\/list`si','<ul type="$1">$2</ul>',$chaine);
	$chaine = preg_replace('`\[list](.+?)\|/list]`si','<ul>$1</ul>',$chaine);
	
	// Bloc des balises [*]
	$chaine = preg_replace('`\[\*=(circle|disc|square|i)](.+?)`si','<li type="$1">$2',$chaine);
	$chaine = preg_replace('`\[\*](.+?)`si','<li>$1',$chaine);
	
	return $chaine;
}
// /!\ Appel de la fonction : echo forum_code($chaine);
/* IMPORTANT : PENSEZ A METTRE LES STYLES (balises) POUR UNR BONNE MISE EN FORME DE CERTAINES BALISES TELLES QUE LES [div], [QUOTE] ! */
echo forum_code('[code=php]<?php echo 'coucou'; ?>/code');
?>

Conclusion :


Merci à XwZ du forum PHPDebutant qui m'a aidé à me démeler avec les Expressions Régulières ;o)

Liste des balises (+ Explications) :
->[url=x]titre lien/url
->[url]adresse_lien/url

-> [b]texte en gras/b
-> [i]texte en italique/i
-> [u]texte souligné/u
-> [strike]texte barré/strike
-> [overline]texte surligné/overline

-> [code]code/code
-> [code=css]Code CSS/code
-> [code=php]Script PHP (! en incluant les ouvertures et fermetures !)/code

->[quote=me]Citation de vous/quote
->[quote=quelqu'un]Citation de quelqu'un/quote
->[quote]citation sans auteur / nom/quote

->[img=adresse_image]titre de l'image/quote
->[img]adresse_image/img

-> [align]texte soit à gauche, soit au centre, soit à droite, soit justifié/align

-> [color=x]texte en couleur x/color
-> [size=x]texte d'une taille x/size
-> [thick=x]texte d'une epaisseur x/thick
-> [style]texte soit normal, soit italic, soit oblique/style
-> [weight]texte soit gras clair, gras, ou gras foncé/weight
-> [font=x]texte écrit dans la police x/font

->[list=(circle|disc|square|i)]list avec des puces en forme de cercle / disque / carrés / chiffres romains/list
->[list]texte listé/list
->[*]premier élément de la liste [*]2nd élément [*]3ème (.....) (avec les mêmes option que [list]/list)

Pour appeler appeler (utiliser) la fonction, pensez à mettre l'instruction <?php echo forum_code($chaine); ?> (ou <?php echo forum_code($chaine,true); ?> si vous voulez que le code html soit possible)

A voir également

Ajouter un commentaire Commentaires
Messages postés
2
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
28 janvier 2010

mais au fait qu'est ce que viennent faire ces crochets dans tes regex?! pour [http://]: à remplacer par http:// sans crochet.
Messages postés
2
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
28 janvier 2010

il manque les styles de code_main et code_top.
Messages postés
33
Date d'inscription
mardi 23 mai 2006
Statut
Membre
Dernière intervention
28 février 2009

Complet, et ça marche en plus ! Bonne volonté et bon travail !
Messages postés
11
Date d'inscription
dimanche 9 novembre 2003
Statut
Membre
Dernière intervention
28 juillet 2007

Merci bien cela règle mon problème :)
En attendant une confirmation ici j'en ai profité pour lire quelques tuto sur les regex, c'est ce qu'on appelle une nuit constructive :)

En tout cas merci encore pour ce code !
Messages postés
39
Date d'inscription
samedi 7 mai 2005
Statut
Membre
Dernière intervention
20 juin 2005

Hello,

Eh bien, tu veux juste mettre pt dans la balose [size] ou bien aussi dans le css ? Si c'est seulement dans la balise, remplace là par :

# // Bloc des balises [size]-/size
# $chaine = preg_replace('#\[size=([0-9]{1,2})pt](.+?)\/size#si','$2',$chaine);
Afficher les 67 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (OniTalus)