BBCODE et IMAGE... [Résolu]

scharly3 88 Messages postés mardi 1 juillet 2003Date d'inscription 9 juillet 2009 Dernière intervention - 21 juin 2008 à 16:45 - Dernière réponse : Farfadh 68 Messages postés dimanche 1 avril 2007Date d'inscription 7 juillet 2008 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Evangun 1982 Messages postés dimanche 20 février 2005Date d'inscription 24 septembre 2012 Dernière intervention - 21 juin 2008 à 17:35
3
Merci
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...

à+

Merci Evangun 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de Evangun
Meilleure réponse
pysco68 681 Messages postés samedi 26 février 2005Date d'inscription 21 août 2014 Dernière intervention - 21 juin 2008 à 17:36
3
Merci
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" />

Merci pysco68 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de pysco68
Meilleure réponse
scharly3 88 Messages postés mardi 1 juillet 2003Date d'inscription 9 juillet 2009 Dernière intervention - 21 juin 2008 à 18:35
3
Merci
Quel horreur on ne pe pas editer ton post :d Je vien de comprendre le pourquoi d'un tableau en entrée de fonction ^^'

Merci scharly3 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de scharly3
pysco68 681 Messages postés samedi 26 février 2005Date d'inscription 21 août 2014 Dernière intervention - 21 juin 2008 à 17:25
0
Merci
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" />
Commenter la réponse de pysco68
scharly3 88 Messages postés mardi 1 juillet 2003Date d'inscription 9 juillet 2009 Dernière intervention - 21 juin 2008 à 17:28
0
Merci
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.
Commenter la réponse de scharly3
scharly3 88 Messages postés mardi 1 juillet 2003Date d'inscription 9 juillet 2009 Dernière intervention - 21 juin 2008 à 17:40
0
Merci
[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.
Commenter la réponse de scharly3
scharly3 88 Messages postés mardi 1 juillet 2003Date d'inscription 9 juillet 2009 Dernière intervention - 21 juin 2008 à 18:29
0
Merci
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
Commenter la réponse de scharly3
pysco68 681 Messages postés samedi 26 février 2005Date d'inscription 21 août 2014 Dernière intervention - 21 juin 2008 à 18:36
0
Merci
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" />
Commenter la réponse de pysco68
scharly3 88 Messages postés mardi 1 juillet 2003Date d'inscription 9 juillet 2009 Dernière intervention - 21 juin 2008 à 18:37
0
Merci
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
Commenter la réponse de scharly3
pysco68 681 Messages postés samedi 26 février 2005Date d'inscription 21 août 2014 Dernière intervention - 21 juin 2008 à 18:39
0
Merci
...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" />
Commenter la réponse de pysco68
Farfadh 68 Messages postés dimanche 1 avril 2007Date d'inscription 7 juillet 2008 Dernière intervention - 2 juil. 2008 à 08:01
0
Merci
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.
Commenter la réponse de Farfadh

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.