Problème BBCode

Eléphant du PHP | 418 Messages

29 déc. 2011, 20:00

Salutation à tous (Bonnes fêtes au passage)

Voici mon problème

J'ai besoin de BBCode, et j'ai un soucis avec le remplacement des URL

En effet, j'aimerais que les code de type:

Code : Tout sélectionner

[url]adresse[/url] [url=adresse]description[/url]
soit remplacer par

Code : Tout sélectionner

<a href="adresse">adresse</a> <a href="adresse">desciption</a>
Voici le regex que j'ai mis en place, mais qui ne remplace rien.

Code : Tout sélectionner

$texte = preg_replace('`\[url\](#[a-zA-Z0-9._/-:]+#i)\[/url\]`isU','<a href="$1" target="_blank">$1</a>',$texte); $texte = preg_replace('`\[url=(#[a-zA-Z0-9._/-:]+#i)\](#[a-zA-Z0-9._/-:]+#i)\[/url\]`isU', '<a href="$1" target="_blank">$2</a>',$texte);
Comment pourrais je faire ceci SVP?

Merci de votre aide

Cordialement

Mammouth du PHP | 1339 Messages

30 déc. 2011, 01:25

En cherchant 5 minutes sur le web.
<?php

$texte = '[url]http://www.awnip.fr[/url]';
$texte = preg_replace("#\[url\]((ht|f)tp://)([^\r\n\t<\"]*?)\[/url\]#sie", "'<a href=\"\\1' . str_replace(' ', '%20', '\\3') . '\" target=\"blank\">\\1\\3</a>'", $texte);
$texte = preg_replace("/\[url=(.+?)\](.+?)\[\/url\]/", "<a href=\"$1\" target=\"blank\">$2</a>", $texte);
echo $texte;

?>
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Eléphant du PHP | 418 Messages

30 déc. 2011, 10:46

Merci à toi

J'ai chercher plus d'une heure sur le web, j'ai même lu sur ce forum, (le code posté plus haut ne sort pas de ma tête, je connais pas assez les regex pour ça.

En tout cas merci pour ton aide, ça fonctionne à merveille.

Cordialement

Eléphant du PHP | 418 Messages

02 janv. 2012, 00:56

Salutation

Bonne année à tous

Voici que j'ai de nouveau un soucis

En effet, je souhaite créer un bbcode, plus pour apprendre qu'autre chose, mais je pourrais ainsi l'utiliser sur mes site pour la mise en page sans html dans les textarea.)

bref, j'ai longtemps chercher sur le net avant de venir poster ici, et voici le sujet:

J'aimerais savoir comment traiter dans le texte (sur la page qui affiche le résultat d'une requête sql permettant d'afficher un message ou autre) la structure des listes ordonnée ou non ordonnées.

voici à quoi ressemble le bbcode (c le même que phpbb)

Code : Tout sélectionner

liste ordonnée [list=option] [*]liste 1 [*]liste 2 [*]liste 3 [/list] Liste non ordonnée [list] [*]liste 1 [*]liste 2 [*]liste 3 [/list] Ce qui doit m'afficher: liste ordonnée <ol style="option"> <li>liste 1</li> <li>liste 2</li> <li>liste 3</li> </ol> Liste non ordonnée <ul> <li>liste 1</li> <li>liste 2</li> <li>liste 3</li> </ul>
Je sais que je vais devoir utiliser des regex, alors pour vous permettre de comprendre comment je traite mon bbcode, voici le script de ma fonction php

Code : Tout sélectionner

<?php // Fonction  BBcode function code($texte) { //Smileys $texte = str_replace(':D ', '<img src="./images/smileys/heureux.gif" title="heureux" alt="heureux" />', $texte); $texte = str_replace(':lol: ', '<img src="./images/smileys/lol.gif" title="lol" alt="lol" />', $texte); $texte = str_replace(':triste:', '<img src="./images/smileys/triste.gif" title="triste" alt="triste" />', $texte); $texte = str_replace(':frime:', '<img src="./images/smileys/cool.gif" title="cool" alt="cool" />', $texte); $texte = str_replace(':rire:', '<img src="./images/smileys/rire.gif" title="rire" alt="rire" />', $texte); $texte = str_replace(':s', '<img src="./images/smileys/confus.gif" title="confus" alt="confus" />', $texte); $texte = str_replace(':O', '<img src="./images/smileys/choc.gif" title="choc" alt="choc" />', $texte); $texte = str_replace(':question:', '<img src="./images/smileys/question.gif" title="?" alt="?" />', $texte); $texte = str_replace(':exclamation:', '<img src="./images/smileys/exclamation.gif" title="!" alt="!" />', $texte); //Mise en forme du texte //gras $texte = preg_replace('`\[g\](.+)\[/g\]`isU', '<strong>$1</strong>', $texte);  $texte = preg_replace('`\[b\](.+)\[/b\]`isU', '<strong>$1</strong>', $texte);  //italique $texte = preg_replace('`\[i\](.+)\[/i\]`isU', '<em>$1</em>', $texte); //souligné $texte = preg_replace('`\[s\](.+)\[/s\]`isU', '<u>$1</u>', $texte); //alignement justifié $texte = preg_replace('`\[justify\](.+)\[/justify\]`isU', '<div style="text-align:justify;">$1</div>', $texte); //alignement centré $texte = preg_replace('`\[center\](.+)\[/center\]`isU', '<div style="text-align:center;">$1</div>', $texte); //alignement doit $texte = preg_replace('`\[right\](.+)\[/right\]`isU', '<div style="text-align:right;margin:0px;padding:0px;">$1</div>', $texte); //alignement gauche $texte = preg_replace('`\[left\](.+)\[/left\]`isU', '<div style="text-align:left;margin:0px;padding:0px;">$1</div>', $texte); //titre $texte = preg_replace('`\[titre\](.+)\[/titre\]`isU', '<h3>$1</h3>',$texte); //email $texte = preg_replace('`\[email\](.+)\[/email\]`isU', '<a href="mailto:$1">$1</a>',$texte); //image  $texte = preg_replace('`\[img\](.+)\[/img\]`isU', '<img src="$1" border="0">',$texte); //lien $texte = preg_replace("#\[url\]((ht|f)tp://)([^\r\n\t<\"]*?)\[/url\]#sie", "'<a href=\"\\1' . str_replace(' ', '%20', '\\3') . '\" target=\"blank\">\\1\\3</a>'", $texte); $texte = preg_replace("/\[url=(.+?)\](.+?)\[\/url\]/", "<a href=\"$1\" target=\"blank\">$2</a>", $texte); //citation $texte = preg_replace('`\[quote auteur=([a-z0-9A-Z._-]+) \](.+)\[/quote\]`isU', '<div id="quote">Auteur : $1 <br /> $2 </div>', $texte); $texte = preg_replace('`\[quote](.+)\[/quote\]`isU', '<div id="quote">Citation : <br />$1</div>', $texte); //Sploiler $texte = preg_replace('`\[spoiler](.+)\[/spoiler\]`isU', "<dl class=\"codebox\"><span style=\"cursor:pointer;\" onclick=\"var elementmode = this.getElementsByTagName('span');for(var i=0;i<elementmode.length;i++){if(elementmode[i].title == 'Afficher'){elementmode[i].style.display=(!elementmode[i].style.display)?'none':'';}}\"><dt class=\"codebox\">Afficher</dt><span title=\"Afficher\" style=\"display:none;cursor:text;\">$1</span></span></dl>", $texte); //code $texte = preg_replace('`\[code](.+)\[/code\]`isU', '<dl class=codebox><dt class="codebox">Code: <a title="Tout sélectionner" style="cursor:pointer;" onclick=selectCode(this); return false;>Tout sélectionner</a></dt><dd><code>$1</code></dd></dl>', $texte); //etc., etc. //On retourne la variable texte return $texte; } ?>
Merci pour votre aide.

Cordialement

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 janv. 2012, 13:12

Le principe reste le même pour des listes que pour les autres tags bbcode... Si tu sais remplacer ... par <b>...</b>, tu dois aisément pouvoir remplacer
  • ...
par <ul>...</ul>. De même pour ta liste ordonnée ou tes balises <li> au lieu de [*].

La seule petite difficulté consiste à trouver comment coller des </li> pour avoir un code html valide (pour ceux qui s'en soucient encore)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 418 Messages

02 janv. 2012, 16:35

j'ai essayer de séparer les balises

en remplaçant dans un premier temps les balise <ul> et <ol>
ensuite, je traité les liste <li></li>
et je refermer les balise <ul> et <ol> mais en vain

voici ce que j'ai fait, ça m'affiche qu'une ligne seulement, ce qui entre nous me semble normal, car je ne pense pas que ça soit correct:

Code : Tout sélectionner

$texte = preg_replace('`\[list=([a-z0-9A-Z._-]+)](.+?)[*](.+?)\[/list]`isU', '<ol><li>$1</li></ol>', $texte); $texte = preg_replace('`\[list][*](.+?)\[/list]`isU', '<ul><li>$1</li></ul>', $texte);
En fait je pense qu'il faut le faire en plusieurs fois, mais je ne vois pas comment l'agencer.

Merci de votre aide

Cordialement

Eléphant du PHP | 418 Messages

02 janv. 2012, 17:23

j'ai simplifié tant pis

j'ai créer une balise [listo] et [/listo]
et pour les <li></li> [*][/*]

ensuite si il s'agit d'une balise [listo] on commence une liste ordonée sinon une simple liste

Voici le script permettant d'interprété cela
$texte=str_replace('[list]', '<ul>', $texte);
$texte=str_replace('[listo]', '<ol>', $texte);
$texte=str_replace('[*]', '<li>', $texte);
$texte=str_replace('[/*]', '</li>', $texte);
$texte=str_replace('[/list]', '</ul>', $texte);
$texte=str_replace('[/listo]', '</ol>', $texte);
Voila, plus de ligne mais fonctionnel

Si vous avez plus simple, je prend

Merci à vous

Cordialement

Eléphant du PHP | 418 Messages

02 janv. 2012, 20:57

Eu juste un soucis d'affichage

En fait pour afficher mon code et les retours à la ligne, j'utilise la fonction nl2br(), mais le soucis c'est que ça me met des <br> après les </li>, les </ul>, les </ul> et de même pour <ol> et </ol>

Comment faire pour enlever ses retour chariot SVP?

Merci

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 janv. 2012, 21:23

faire le nl2br après le bbcode (vu que c'est toi qui le fait c'est pas bien dur de le déplacer ? :) )

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 418 Messages

02 janv. 2012, 22:07

déjà fait, ça change rien
$post_texte=code(nl2br(stripslashes(htmlspecialchars($data['post_texte']))));
Merci de ton aide