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 :
Et, pour exemple, un aperçu d'un message qui génère l'erreur:
Merci d'avance pour votre aide.
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.