BBCODE et IMAGE...

Résolu
scharly3 Messages postés 88 Date d'inscription mardi 1 juillet 2003 Statut Membre Dernière intervention 9 juillet 2009 - 21 juin 2008 à 16:45
Farfadh Messages postés 68 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 7 juillet 2008 - 2 juil. 2008 à 08:01
Bonjour,
Me voici dans la phase de finalisation d'un forum et pour l'insertion des images j'utilise :
<hr size="2" width="100%" />
function filtreimage($message)
{
    list($debut, $fin) = explode("", $fin);
    if($image!="") {
    $infos_image = getImageSize($image); // Fonction getImageSize permet de connaitre les dimensions de l'imgage
        if($infos_image[0]<= 400 && $infos_image[1]<= 400)// si l'image fait moins de 400 * 400
        {
       
            $image="";
        }
        else // si elle fait plus de 400*400
        {
            if($infos_image[0]<=$infos_image[1]) // Redimension de selon la largeur ou la longueur
            {
            $width=$infos_image[0]/$infos_image[1]*400;
            $height=400;
            }
            else
            {
            $width=400;
            $height=$infos_image[1]/$infos_image[0]*400;
            }
            $image="";
       
        }
    $message=$debut.$image.$fin;//reformation du message avec les balises
    }
    return $message;
}
<hr size="2" width="100%" />
Or, avec cette méthode, je ne peut traiter qu'une image par message les autres images éventuellement présentes sont supprimées, que puis-je utiliser d'autre que  "list($debut, $fin) = explode("", $fin); " pour extraire et traiter mon image?
Merci.
A voir également:

11 réponses

Evangun Messages postés 1980 Date d'inscription dimanche 20 février 2005 Statut Membre Dernière intervention 24 septembre 2012 4
21 juin 2008 à 17:35
Bonjour,

je ne comprend pas bien le problème... explode te renvoie un tableau. Avec ton list tu ne prends que les deux premiers éléments alors qu'il faudrait traiter le tableau entier avec une simple boucle foreach...

à+
3
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
21 juin 2008 à 17:36
maintenant je comprends ton problème ;)

regarde voir cette fonction: http://fr.php.net/manual/fr/function.preg-replace-callback.php
elle devrait t'aider ;)

<hr size="2" width="100%" />Developpement Web Yannic GraphiX | Mon CMS yArt et sa démo
<hr size="2" width="10" />
3
scharly3 Messages postés 88 Date d'inscription mardi 1 juillet 2003 Statut Membre Dernière intervention 9 juillet 2009
21 juin 2008 à 18:35
Quel horreur on ne pe pas editer ton post :d Je vien de comprendre le pourquoi d'un tableau en entrée de fonction ^^'
3
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
21 juin 2008 à 17:25
tu peux utiliser preg_replace() si tu sais te servir d'expressions régulières...

je t'ai ressorti un petit parser BBCode que j'avais écrit il y a quelques années.... regarde comment je fais... et puis si tu veux utilise le ;)

<hr size= "2" width="100%" />function bbcode ($chaine) {
   $motifs = array(
       '\[b\](.*?)\[\/b\]\',
       '\[i\](.*?)\[\/i\]\',
       '\[u\](.*?)\[\/u\]\',
       '\[img\](.*?)\[\/img\]\',
       '\[url\=(.*?)\](.*?)\[\/url\]\',
       '\[code\](.*?)\[\/code\]\'
   );
   $remplace = array(
       ' \\1 ',
       ' \\1 ',
       '\\1',
       '',
       '[\\1 \\2]',
       '
\\1
'
   );
   return preg_replace($motifs, $remplace, $chaine);
}
<hr size ="2" width="100%" />Bon je sais que c'est pas des plus propres versiones, et que dans certaines conditions d'arborescence elle déglingue... mais elle marche ;)

Bonne journée!

<hr size="2" width="100%" />Developpement Web Yannic GraphiX | Mon CMS yArt et sa démo
<hr size="2" width="10" />
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scharly3 Messages postés 88 Date d'inscription mardi 1 juillet 2003 Statut Membre Dernière intervention 9 juillet 2009
21 juin 2008 à 17:28
Tous mes autres bbcode utilise les regex, mais la je doit récupéré l'url pour la traiter dans une fonction pour l'image ce n'est donc à ma connaissance pas faisable par ce moyen la.
0
scharly3 Messages postés 88 Date d'inscription mardi 1 juillet 2003 Statut Membre Dernière intervention 9 juillet 2009
21 juin 2008 à 17:40
[auteur/EVANGUN/452661.aspx Evangun] Merci, je n'avais pas réellement compris le fonctionnement d'explode.


[auteur/PYSCO68/457351.aspx pysco68] : Merci, cette solution m'a l'air encore plus performante.
0
scharly3 Messages postés 88 Date d'inscription mardi 1 juillet 2003 Statut Membre Dernière intervention 9 juillet 2009
21 juin 2008 à 18:29
Bonjour,

J'ai essayé de comprendre la fonction preg_replace_callback sans grand succès,
en effet lorsque j'effectue ceci: $message=preg_replace_callback("#\[img\](.+?)\[\/img\]#isU","filtreimage",$message);
Ma fonction filtreimage recoit un tableau de plus il semble que les soit transmit aussi à la fonction.

Une petite indication sur son fonctionnement me serrait d'une grande aide.

Pour l'instant mon code ressemble à ceci:
<hr size="2" width="100%" />$message=preg_replace_callback("#\[img\](.+?)\[\/img\]#isU","filtreimage",$message);

function filtreimage($images)
{
   
     foreach($images as $image)
    {
        if($image!="") {
        $infos_image = getImageSize($image); // Fonction getImageSize permet de connaitre les dimensions de l'imgage
            if($infos_image[0]<= 400 && $infos_image[1]<= 400)// si l'image fait moins de 400 * 400
            {
           
                $image="";
            }
            else // si elle fait plus de 400*400
            {
                if($infos_image[0]<=$infos_image[1]) // Redimension de selon la largeur ou la longueur
                {
                $width=$infos_image[0]/$infos_image[1]*400;
                $height=400;
                }
                else
                {
                $width=400;
                $height=$infos_image[1]/$infos_image[0]*400;
                }
                $image="";
           
            }
        $message=$image;
        }
    }
    return $message;
   
}

<hr size="2" width="100%" />
Merci
0
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
21 juin 2008 à 18:36
preg_replace_callback rends effectivement un tableau....  pourrais tu me montrer à quoi il ressemble?

peut-ête qu'a final ce sera quand même plus rapide à faire avec un simple explode...

<hr size="2" width="100%" />Developpement Web Yannic GraphiX | Mon CMS yArt et sa démo
<hr size="2" width="10" />
0
scharly3 Messages postés 88 Date d'inscription mardi 1 juillet 2003 Statut Membre Dernière intervention 9 juillet 2009
21 juin 2008 à 18:37
Le tableau est finalement le resultat de la regex, c'est a dire les variables $1,$2 ... trouvé dans la chaine ^^' pas trés clair tous ca sur php.net
0
pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
21 juin 2008 à 18:39
...le premier exemple est un peux opaque effectivement.... mais il ne te reste qu'a faire un foreach sur le tout... et normalement tu peux traiter tes infos correctement ;)

<hr size="2" width="100%" />Developpement Web Yannic GraphiX | Mon CMS yArt et sa démo
<hr size="2" width="10" />
0
Farfadh Messages postés 68 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 7 juillet 2008 4
2 juil. 2008 à 08:01
Je tiens à dire que le BBCode standard présente une faille d'importance : il n'y a pas de manière de préciser qu'un caractère spécial ne doit pas être interprété. Ce n'est pas très grave, mais avec les codes standards on ne peut pas utiliser les crochets librement dans un texte. Si on tente sur un forum d'expliquer à quelqu'un qu'il faut utiliser la balise texte pour mettre le texte en caractères gras, les balises BBCode vont être interprétées et on aura pas le résultat escompté. Vous me direz qu'on peut contourner ça en écrivant [ b]texte[ /b], les espaces vont empêcher le BBCode d'opérer la transformation. Mais ce n'est pas tout, si vous utilisez une balise [balise=attribut], vous ne pourrez pas mettre de crochet fermant dans votre attribut.

Deux solutions pour parer à ce problème s'offre à ceux que ça intéresse :
- le code HTML propose des codes pour afficher les caractères qui composent ses balises sous la forme &code; et il suffit de faire des codes équivalents. Seulement ça impose de traiter tous les éléments découpés par les expressions régulières avec une fonction qui va reconvertir ces codes en caractères.
- les chaînes de caractères proposent le plus souvent des caractères d'échappement pour insérer des caractères spéciaux et on peut imaginer que tout crochet précédé d'un antislash ne sera pas interprété comme un caractère composant une balise.

Jusqu'ici j'ai adopté la seconde solution, mais je me rend compte que mon choix n'est pas logique, puisque le fonctionnement du BBCode se rappoche de celui du HTML, pas des chaînes de caractères. De toute manière, je devais réécrire mon script de conversion. Quand ce sera fait je publierai une source. La question que je me pose c'est si les utilisateurs sauront s'en servir, mais ça ne devrait pas poser de problème.

De toute manière, dans un avenir relativement proche, le champ de texte avec mise en forme comme celui de ce forum sera beaucoup plus répandu et la question ne se posera plus.
0
Rejoignez-nous