8792 sujets

Développement web côté serveur, CMS

Bonjour à tous.

Ca fait une paie que je n'ai plus posté, j'en profite donc pour passer le bonjour à tout le monde (et meilleurs voeux à tous pour 2007).

Je viens poster ici car j'ai un petit problème qui me turlupine.

Dans le cadre d'un projet scolaire (plus d'infos sur la page temporaire du projet, son explication ne change rien au problème actuel), j'utilise un système de BBCode, réalisé à la main, pour mettre en page le contenu de textes du site.

J'utilise le BBCode car il reste connu du "grand public" des surfeurs, et assez accéssible aux néophytes, donc pas de message me disant d'utiliser le langage wiki, merci, j'ai fait mon choix.

Mon problème est le suivant:

Avant de parser une chaine BBCodisée, je lui applique un nl2p, qui transforme les retours à la ligne en nouveau <p> (voir code plus bas).
Ensuite, je parse le BBCode à l'aide de la fonction qu vous verrez plus bas.

Le problème, c'est que les retours à la ligne entre les balises de liste <ul><li> et <ol><li> sont transformées en <p>, ce qui bien sûr ne génère plus un code valide.
J'ai bien tenté de nettoyer les balises <p> vides, mais ça ne marche pas, elles restent constemment.

Voici le code de mes deux fonctions, nl2p et parseBBCode :

         function nl2p($chaine) {
	        return '<p>' . str_replace("\n", "</p><p>", $chaine) . "</p>";
         } // nl2p

         function parseBBCode($chaine) {
		// retours chariot
		$chaine = nl2p($chaine);
		
		// [url=x]-[/url]
		$chaine = preg_replace('`\[url=([http://].+?)](.+?)\[/url]`si','<a href="$1" rel="external" title="$1">$2</a>',$chaine);
		$chaine = preg_replace('`\[url=(.+?)](.+?)\[/url]`si','<a href="http://$1" rel="external" title="$1">$2</a>',$chaine);
		$chaine = preg_replace('`\[url]([http://].+?)\[/url]`si','<a href="$1" rel="external" title="$1">$1</a>',$chaine);
		$chaine = preg_replace('`\[url](.+?)\[/url]`si','<a href="http://$1" rel="external" title="$1">$1</a>',$chaine);
				
		// [img]-[/img]
		$chaine = preg_replace('#\[img](.+?)\[/img]#si','<img src="$1" alt="" />',$chaine);
		
		// [b]-[/b]
		$chaine = preg_replace('#\[b](.+?)\[/b]#si','<strong>$1</strong>',$chaine);
		
		// [u]-[/u]
		$chaine = preg_replace('#\[u](.+?)\[/u]#si','<span class="BBC_underline">$1</span>',$chaine);
		
		// [i]-[/i]
		$chaine = preg_replace('#\[i](.+?)\[/i]#si','<em>$1</em>',$chaine);
		
		// [strike]-[/strike] & [del]-[/del]
		$chaine = preg_replace('#\[strike](.+?)\[/strike]#si','<span class="BBC_del">$1</span>',$chaine);
		$chaine = preg_replace('#\[del](.+?)\[/del]#si','<span class="BBC_del">$1</span>',$chaine);
		
		// [align]-[/align]
		$chaine = preg_replace('#\[align=(left|center|right|justify)](.+?)\[/align]#si','<p class="BBC_$1">$2</p>',$chaine);
		
		// [color]-[/color]
		$chaine = preg_replace('#\[color=(.+?)](.+?)\[/color]#si','<span style="color:$1;">$2</span>',$chaine);
		
		// [size]-[/size]
		$chaine = preg_replace('#\[size=([0-9]{1,2})](.+?)\[/size]#si','<span style="font-size:$1px;">$2</span>',$chaine);
		
		// [font]-[/font]
		$chaine = preg_replace('#\[font=(.+?)](.+?)\[/font]#si','<span style="font-family:$1;">$2</span>',$chaine);
		
		// [ulist]-[/ulist]
		$chaine = preg_replace('#\[ulist](.+?)\[/ulist]#si','<ul>$1</ul>',$chaine);
		
		// [olist]-[/olist]
		$chaine = preg_replace('#\[olist](.+?)\[/olist]#si','<ol>$1</ol>',$chaine);
			
		// [li]-[/li]
		$chaine = preg_replace('#\[li](.+?)\[/li]#si','<li>$1</li>',$chaine);
		
		// nettoyage des <p></p> vides
		$chaine = preg_replace('`(\s*?)<p>(\s*?)</p>(\s*?)`', '$2', $chaine);
		$chaine = strtr($chaine,array("<p> </p>"=>""));
		$chaine = strtr($chaine,array("<p></p>"=>""));
		$chaine = strtr($chaine,array("<p></p><li>"=>""));
		$chaine = strtr($chaine,array("<p></p><ul>"=>""));
		$chaine = strtr($chaine,array("<p></p><ol>"=>""));
		$chaine = strtr($chaine,array("<p></p></ul>"=>""));
		$chaine = strtr($chaine,array("<p></p></ol>"=>""));
		
		
		return $chaine;
	 } // parseBBCode


Et, pour exemple, un aperçu d'un message qui génère l'erreur:

<p>Une petite liste pour corriger le bug...</p>

<p></p><ul>
<p></p><li>Test ?</li>
<p></p><li>Test ?</li>
<p></p></ul>


Merci d'avance pour votre aide.
Apparemment non, en effet.

(Mais, bon, ça n'empêche pas de te dire -un peu tard- "bonjour" et "meilleurs voeux 2007" en retour Smiley ravi )
c'est ta fonction nl2p qui cause le pb, du moins la manière avec laquelle elle crée les paragraphes... essaye de faire une règle de recherche style :
"si j'ai un texte entre 1 balise fermante et une ouvrante alors je le mets entre <p></p>"

comme par exemple (pas le temps de tester, je pense qu'il ya des erreurs dans la syntaxe :

function nl2p($chaine) {
    return preg_replace('#</.*>(.*)<[^/].*[^/]>#si','<p>$1</p>',$chaine);
} // nl2p


en gros dès que ça rencontre un truc du style :
</ul> texte blahblah <img href="image.png" /> texte blahblah <ul>
ça le transforme en
</ul><p> texte blahblah <img href="image.png" /> texte blahblah </p><ul>


mais en écrivant, je viens de me rendre compte que ça pose problème pour le texte en gras etc... on pourrait alors "compliquer" la regexp pour faire en sorte d'inclure les balises de formattage dans le paragraphe... une piste à creuser...

Edit : bien entendu, avec cette regexp, il faut appeler la fonction à la fin du traitement du bbcode et plus avant comme tu le faisais
Modifié par Jeff-com (02 Feb 2007 - 10:29)