[ PHP ]: Ex. code formatage texte & smilie pour chat/forum

: Ex. code formatage texte & smilie pour chat/forum [ PHP ] - Programmation

Marsh Posté le 26-11-2001 à 00:44:57    

Voilà, j'ai un problème avec une variable globale d'un type particulier.
Afin de gérer facilement et efficacement les balises de format de texte (gras , souligné , ...) de mon chat, je veux utiliser une variable globale qui est en fait un tableau d'objet.
Ce tableau à un nombre d'éléments variable.
Chaque élément est composé des éléments suivants :
code_deb
code_fin
html_deb
html_fin
exemple
 
Pour deux balise de formatage de texte j'obtiens donc un objet ($code) qui a cette forme :
$code[0][code_deb]
$code[0][code_fin]
$code[0][html_deb]
$code[0][html_fin]
$code[0][exemple]
$code[1][code_deb]
$code[1][code_fin]
$code[1][html_deb]
$code[1][html_fin]
$code[1][exemple]
 
Quand je charge les valeurs de cet objet directement dans la fonction qui traite les donées, ca marche comme il faut.
Quand j'affecte les valeurs de cet objet dans une autre fonction (en ayant cet objet en variable globale), le traitement deviens infiniment long et plus rien n'est retourné au navigateur.
Que dois je faire pour que ca marche comme il faut?
 
PS : Voilà le code de mes fonctions :
 
// sert à rejouter une bamise de traitement de texte
function rajoutecode($codedebut,$codefin,$htmldebut,$htmlfin,$exemple)
{ global $num_code
  global $code;
  $num_code=$num_code+1;
 
  $code[$num_code-1][code_deb]=$codedeb;
  $code[$num_code-1][code_fin]=$codedeb;
  $code[$num_code-1][html_deb]=$htmldeb;
  $code[$num_code-1][html_fin]=$htmlfin;
  $code[$num_code-1][exemple]=$exemple;
}
 
// sert à remplacer toutes les balises en code html classique
function codetohtml($texte)
{ global $num_code
  global $code;
 
// $num_code=2;
//  $code[0][code_deb]=":I:";
//  $code[0][code_fin]=":/I:";
//  $code[0][html_debut]="<I>";
//  $code[0][html_fin]="</I>";
//  $code[0][exemple]=":I: en italique :/I:";
//  $code[1][code_deb]=":S:";
//  $code[1][code_fin]=":/S:";
//  $code[1][html_debut]="<S>";
//  $code[1][html_fin]="</S>";
//  $code[1][exemple]=":S: en italique :/S:";
 
  rajoutecode(":I:",":/I:","<I>","</I>",":I: en italique :/I:" );
 
  $comp_texte=StrToUpper($texte);
  $modif=1;
  while ($modif==1)
  { $modif=0;
    $i=0;
    while ($i<$num_code)
    { $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
      $pos_fin=strpos($comp_texte,$code[$i][code_fin],$pos_deb);
      if ((substr($texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))
      { //echo $texte;
        $texte=substr($texte,0,$pos_deb) . $code[$i][html_debut] . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . $code[$i][html_fin] . substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin);
        $modif=1;
      }
      $i=$i+1;
    }
  }
  return $texte;
}
 
La partie de la seconde fonction en commentaire est la partie qui m'a paermis de tester ma fonction et voir qu'elle marche bien. C'est en voulant la remplacer par l'utilisation de la fonction au dessus que ca ne fonctionne plus du tout.
 
Merci d'avance pour les infos/tuyaux/corection que vous voudrez bien me donner.

 

[edtdd]--Message édité par omega2--[/edtdd]


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 26-11-2001 à 00:44:57   

Reply

Marsh Posté le 26-11-2001 à 12:24:10    

Bon, en attendant de trouver mieux, je vais modifier le code de la manière suivante :
 
// sert à rejouter une bamise de traitement de texte
function rajoutecode($code,$codedebut,$codefin,$htmldebut,$htmlfin,$exemple)
{ global $num_code
// global $code;
 $num_code=$num_code+1;
 
 $code[$num_code-1][code_deb]=$codedeb;
 $code[$num_code-1][code_fin]=$codedeb;
 $code[$num_code-1][html_deb]=$htmldeb;
 $code[$num_code-1][html_fin]=$htmlfin;
 $code[$num_code-1][exemple]=$exemple;
 return $code;
}
 
// sert à remplacer toutes les balises en code html classique
function codetohtml($texte)
{ global $num_code
 global $code;
 
// $num_code=2;
//  $code[0][code_deb]=":I:";
//  $code[0][code_fin]=" :";
//  $code[0][html_debut]="<I>";
//  $code[0][html_fin]="</I>";
//  $code[0][exemple]=":I: en italique  :";
//  $code[1][code_deb]=":S:";
//  $code[1][code_fin]=" :";
//  $code[1][html_debut]="<S>";
//  $code[1][html_fin]="</S>";
//  $code[1][exemple]=":S: en italique  :";
 
 $code=rajoutecode($code,":I:"," :","<I>","</I>",":I: en italique  :" );
 
 $comp_texte=StrToUpper($texte);
 $modif=1;
 while ($modif==1)
 { $modif=0;
   $i=0;
   while ($i<$num_code)
   { $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
     $pos_fin=strpos($comp_texte,$code[$i][code_fin],$pos_deb);
     if ((substr($texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))
     { //echo $texte;
       $texte=substr($texte,0,$pos_deb) . $code[$i][html_debut] . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . $code[$i][html_fin] . substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin);
       $modif=1;
     }
     $i=$i+1;
   }
 }
 return $texte;
}
 
 
Je vais faire des essaies ce soir pour voir comment le programme va ce comporter.
 
 
Si quelqu'un à une meilleure idée, qu'il n'hésite pas à me la présenter.
 
J'ai oublié de préciser tout à l'heure que le problème semble provenir de la précompilation car même le code qui génére un affichage avant l'appel de la fonction codetohtml ne semble rien retourner.
 
Voilà, a+ tout le monde.
Je vous direz si cette modif fonctionne ou pas une fois que j'aurais finis mes tests. :)


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 27-11-2001 à 01:05:15    

Comme promis, voilà où j'en suis.
La partie formatage de texte marche comme il faut. Voilà le code qui marche. :
/-----------------------------------/
 
function initialisecodes()
{ global $num_code;
  $num_code=4;
  $code[0][code_deb]=":CODE:";
  $code[0][code_fin]=":/CODE:";
  $code[0][html_debut]="<CODE>";
  $code[0][html_fin]="</CODE>";
  $code[0][exemple]=":B:smilie et formatage de texte actif:):/B::CODE::B: smilie :) et formatage de texte :G:désactivé:/g: :/B::/CODE::B:smilie et formatage de texte actif:):/B:";
  $code[1][code_deb]=":I:";
  $code[1][code_fin]=":/I:";
  $code[1][html_debut]="<I>";
  $code[1][html_fin]="</I>";
  $code[1][exemple]=":I: en italique :/I:";
  $code[2][code_deb]=":S:";
  $code[2][code_fin]=":/S:";
  $code[2][html_debut]="<S>";
  $code[2][html_fin]="</S>";
  $code[2][exemple]=":S: texte barré :/S:";
  $code[3][code_deb]=":B:";
  $code[3][code_fin]=":/B:";
  $code[3][html_debut]="<B>";
  $code[3][html_fin]="</B>";
  $code[3][exemple]=":B: en gras :/B:";
  $code[4][code_deb]=":U:";
  $code[4][code_fin]=":/U:";
  $code[4][html_debut]="<U>";
  $code[4][html_fin]="</U>";
  $code[4][exemple]=":U: souligné :/U:";
 
  return $code;
}
 
function codetohtml($texte)
{ global $num_code;
  global $code;
 
  $code=initialisecodes();
 
  $comp_texte=StrToUpper($texte);
//  echo $comp_texte . "<BR>" . $code[0][code_deb]. "<BR>" . $code[0][code_fin] . "<BR>" . $pos_debut . "<BR>" . $pos_fin  . "<BR>" ;
   
// les 4 lignes suivantes sont mises en commentaires car ca fait planté le serveur apache+php sous  windows par dépassement de pile
//  $mod_sepfenetre=substr($texte,$pos_deb+strlen($code[0][code_deb]),$pos_fin-$pos_deb-strlen($code[0][code_fin]));
  $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
  $pos_fin=strpos($comp_texte,$code[$i][code_fin],$pos_deb);
//  if ((substr($texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))
//  { //echo $texte;
//    $texte=codetohtml(substr($texte,0,$pos_deb)) . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . codetohtml(substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin));
//  }else
  { $modif=1;
    while ($modif==1)
    { $modif=0;
      $i=0;
      while ($i<=$num_code)
      { $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
        $pos_fin=strpos($comp_texte,$code[$i][code_fin],$pos_deb);
        if ((substr($texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))
        { //echo $texte;
          $texte=substr($texte,0,$pos_deb) . $code[$i][html_debut] . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . $code[$i][html_fin] . substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin);
          $modif=1;
        }
        $i=$i+1;
      }
    }
  }
 
  // la fonction codetosmilie est désactivé car elle empêche le fonctionnement du programme par ralentissement de l'ensemble
  return $texte; //codetosmilie($texte);
}
 
 
/-----------------------------------/
Voilà donc où j'en suis, le formatage du texte marche mais pas les smilies..
Voilà le code de la fonction de gestion des smilies :
/-----------------------------------/
 
function codetosmilie($texte)
{ $num_code=1;
  $smilie[0][code]=":NOSMILIE:";
  $smilie[0][smilie]=":/NOSMILIE:";
  $smilie[0][exemple]=":):NOSMILIE::):/NOSMILIE::)";
  $smilie[1][code]=">:)";
  $smilie[1][smilie]="diable.gif";
  $smilie[1][exemple]=">:)";
 
  $pos_deb=strpos($comp_texte,$code[0][code],0);
  $pos_fin=strpos($comp_texte,$code[0][smilie],$pos_deb);
// les 4 lignes suivantes sont mises en commentaires car ca fait planté le serveur apache+php sous windows par dépassement de pile
//  if ((substr($texte,$pos_deb,strlen($code[0][code]))==$code[0][code]) && (substr($texte,$pos_fin,strlen($code[0][smilie]))==$code[0][smilie]))
//  { //echo $texte;
//    $ret_texte=codetosmilie(substr($texte,0,$pos_deb)) . substr($texte,$pos_deb+strlen($code[0][code]),$pos_fin-$pos_deb-strlen($code[0][code])) . codetosmilie(substr($texte,$pos_fin+strlen($code[0][smilie]),strlen($texte)-$pos_fin));
//  }else
  { while (strlen($texte)>0)
    { $i=1;
      $j=0;
      $pos_select=strpos($texte,$smilie[0][code],0);
      while ($i<=$num_code)
      { $position=strpos($texte,$smilie[$i][code],0);
        if ($pos_select>$position)
        { $pos_select=$position;
          $j=$i;
        }
      $i=$i+1;
      }
 
    //echo $position."<BR>";
      if (substr($texte,$pos_select,strlen($smilie[$j][code]))==$smilie[$j][code])
      { $ret_texte=$ret_texte.substr($texte,0,$pos_select) . "<IMG SRC=\"/image/smilie/" .$smilie[$j][smilie]. "\" ALT=\"$smilie[$j][code]\">";
        $texte=substr($texte,$pos_select+strlen($smilie[$j][code]),strlen($texte)-$pos_select);
      }else
      { $ret_texte=$ret_texte.$texte;
        $texte="";
      }
    }
  }
  return $ret_texte;
}
 
/-----------------------------------/
 
Cette dernière, fonction, je suis entrain de la remplir mais elle a l'air de fonctionner à peu près (il faut la tester plus profondemment. ;) )


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 27-11-2001 à 01:42:51    

Voilà la dernière fonction. :)
Il me reste plus qu'à remplir l'objet comme pour l'autre cas. :)
/-------------------------------/
 
function codetosmilie($texte)
{ $num_code=3;
  $smilie[0][code]=":NOSMILIE:";
  $smilie[0][smilie]=":/NOSMILIE:";
  $smilie[0][exemple]=":):NOSMILIE::):/NOSMILIE::)";
 
  $smilie[1][code]=">:)";
  $smilie[1][smilie]="diable.gif";
  $smilie[1][exemple]=">:)";
  $smilie[2][code]=":diable:";
  $smilie[2][smilie]="diable.gif";
  $smilie[2][exemple]=":diable:";
 
  $smilie[3][code]=":))";
  $smilie[3][smilie]="biggrin.gif";
  $smilie[3][exemple]=":))";
 
  $comp_texte=StrToUpper($texte);
 
  $pos_deb=strpos($comp_texte,$code[0][code],0);
  $pos_fin=strpos($comp_texte,$code[0][smilie],$pos_deb);
//  if ((substr($texte,$pos_deb,strlen($code[0][code]))==$code[0][code]) && (substr($texte,$pos_fin,strlen($code[0][smilie]))==$code[0][smilie]))
//  { //echo $texte;
//    $ret_texte=codetosmilie(substr($texte,0,$pos_deb)) . substr($texte,$pos_deb+strlen($code[0][code]),$pos_fin-$pos_deb-strlen($code[0][code])) . codetosmilie(substr($texte,$pos_fin+strlen($code[0][smilie]),strlen($texte)-$pos_fin));
//  }else
  { while (strlen($texte)>0)
    { $i=1;
      $j=0;
//      $pos_select=strpos($comp_texte,$smilie[1][code],0);
      $pos_select=strlen($texte);
      while ($i<=$num_code)
      { $position=strpos($comp_texte,$smilie[$i][code],0);
        if (substr($texte,$position,strlen($smilie[$i][code]))==$smilie[$i][code])
        { if ($pos_select>=$position)
          { $pos_select=$position;
            $j=$i;
            }
        }
//        echo "<BR>"." ".$i." ".$j." ".$pos_select." ".$position;
        $i=$i+1;
      }
//echo "<BR>"."<BR>"."<BR>"."<BR>";
    //echo $position."<BR>";
      if (substr($texte,$pos_select,strlen($smilie[$j][code]))==$smilie[$j][code])
      { $ret_texte=$ret_texte.substr($texte,0,$pos_select) . "<IMG SRC=\"/image/smilie/" .$smilie[$j][smilie]. "\" ALT=\"$smilie[$j][code]\">";
        $texte=substr($texte,$pos_select+strlen($smilie[$j][code]),strlen($texte)-$pos_select);
      }else
      { $ret_texte=$ret_texte.$texte;
        $texte="";
      }
    }
  }
  return $ret_texte;
}
 
 
/--------------------------------/
Voilà ddonc du code débugué qui normalement march en php3 et qui permet de gérer els smilies sans problème (et le formatage du texte dans mles fonctions au dessus.


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 27-11-2001 à 11:07:24    

dans la fonction codetosmilie
//  if ((substr($texte,$pos_deb,strlen($code[0][code]))==$code[0][code]) && (substr($texte,$pos_fin,strlen($code[0][smilie]))==$code[0][smilie]))  
//  { //echo $texte;  
//    $ret_texte=codetosmilie(substr($texte,0,$pos_deb)) . substr($texte,$pos_deb+strlen($code[0][code]),$pos_fin-$pos_deb-strlen($code[0][code])) . codetosmilie(substr($texte,$pos_fin+strlen($code[0][smilie]),strlen($texte)-$pos_fin));  
//  }else  
 
 
 
 
dans la fonction codetohtml
//  if ((substr($texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))  
//  { //echo $texte;  
//    $texte=codetohtml(substr($texte,0,$pos_deb)) . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . codetohtml(substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin));  
//  }else  
 
/--------------------------------/
 
Heu, en passant, est ce qu'on peux m'expliquer pourquoi les parties de code précédants entrainent un dépacement de pile même si l'appel récursif de la fonction n'est pas exécuter? Si au moins, c'était un appel récursif qui était exécuté je comprendrais mais là, ca me semble débile ce problème. :(
 
 
Merci d'avance.


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 28-11-2001 à 16:48:54    

Bon, en fait, plusieurs bug ce sont glissé dans mon code avant que je le poste.
De plus, il manque 2-3 initialisation de variable ce qui entraine un malfonctionnement du code chez free (upture du traitement et donc passage d'une boucle normale en boucle sans fin (la chaine $texte n'étant pas modifié)
J'ai corrigé quelques problèmes mais il m'en reste un qui est très génant.
De plus, je vais encore retravailler un peu le code pour rajouter de nouveaux type de balise.
Je ne posterais le code corrigé que quand il sera finis et finalisé. :)
 
PS: Quand je posterais le code, ce topic prendra pour titre : "[ PHP ]: Ex. code formatage texte & smilie pour chat/forum".


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 03-12-2001 à 23:45:36    

Voilà le code "final" (ou presque) de mes fonctions pour gérer des smilies et du formatage de texte dans un forum ou un  chat.
La fonction charge_enregistrement() remplis les variables globales qui contiendront tout ce qui faut au traitement.
La fonction initialiseCodes() remplis la variable $num_code et retourne un enregistrement corespondant au traitement de la fonction codetohtml($texte).
La fonction initialiseSmilies() remplis la variable $num_smilies et retourne un enregistrement corespondant au traitement de la fonction codetosmilie($texte).
 
les fonctions codetohtml($texte) et codetosmilie($texte)  prennent toutes les deux en paramêtres une chaine de caractère et retourne respectivement une chaine traité dont les codes de formatage de texte sont remplacer par les codes html de formatage de texte et une chaine de caractère dont les codes de smilies sont rempalcer par les chemins vers les smilies.
 
 
 
 
/-------------------------------------------------
 
---------------/
 
 
 
 
function charge_enregistrement()
{ global $code;
  global $smilie ;
  $code=initialiseCodes();  
  $smilie=initialiseSmilies();
}
function initialiseCodes()
{ global $num_code;
  $code[0][code_deb]=":CODE:";
  $code[0][code_fin]=":/CODE:";
  $code[0][html_debut]="<CODE>";
  $code[0][html_fin]="</CODE>";
  $code[0][exemple]=":B:smilie et formatage de texte actif:):/B::CODE::B: smilie :) et formatage de texte :G:désactivé:/g: :/B::/CODE::B:smilie et formatage de texte actif:):/B:";
  $code[1][code_deb]=":I:";
  $code[1][code_fin]=":/I:";
  $code[1][html_debut]="<I>";
  $code[1][html_fin]="</I>";
  $code[1][exemple]=":I: en italique :/I:";
  $code[2][code_deb]=":S:";
  $code[2][code_fin]=":/S:";
  $code[2][html_debut]="<S>";
  $code[2][html_fin]="</S>";
  $code[2][exemple]=":S: texte barré :/S:";
  $code[3][code_deb]=":B:";
  $code[3][code_fin]=":/B:";
  $code[3][html_debut]="<B>";
  $code[3][html_fin]="</B>";
  $code[3][exemple]=":B: en gras :/B:";
  $code[4][code_deb]=":U:";
  $code[4][code_fin]=":/U:";
  $code[4][html_debut]="<U>";
  $code[4][html_fin]="</U>";
  $code[4][exemple]=":U: souligné :/U:";
  $num_code=4;
 
  return $code;
}
 
function initialiseSmilies()
{ global $num_smilies;
 
  $smilie[0][code]=":NOSMILIE:";
  $smilie[0][smilie]=":/NOSMILIE:";
  $smilie[0][exemple]=":):NOSMILIE::):/NOSMILIE::)";
  $smilie[0][type]=0;
 
 
  $smilie[1][code]=">:)";
  $smilie[1][smilie]="diable.gif";
  $smilie[1][exemple]=">:)";
  $smilie[1][type]=1;
  $smilie[2][code]=":DIABLE:";
  $smilie[2][smilie]="diable.gif";
  $smilie[2][exemple]=":diable:";
  $smilie[2][type]=1;
 
  $smilie[3][code]=":))";
  $smilie[3][smilie]="biggrin.gif";
  $smilie[3][exemple]=":))";
  $smilie[3][type]=1;
  $smilie[4][code]=":-))";
  $smilie[4][smilie]="biggrin.gif";
  $smilie[4][exemple]=":-))";
  $smilie[4][type]=1;
  $smilie[5][code]=":O))";
  $smilie[5][smilie]="biggrin.gif";
  $smilie[5][exemple]=":O))";
  $smilie[5][type]=1;
  $smilie[6][code]=":D";
  $smilie[6][smilie]="biggrin.gif";
  $smilie[6][exemple]=":D";
  $smilie[6][type]=1;
  $smilie[7][code]=":-D";
  $smilie[7][smilie]="biggrin.gif";
  $smilie[7][exemple]=":-D";
  $smilie[7][type]=1;
  $smilie[8][code]=":OD";
  $smilie[8][smilie]="biggrin.gif";
  $smilie[8][exemple]=":OD";
  $smilie[8][type]=1;
 
  $smilie[9][code]=":)";
  $smilie[9][smilie]="smile.gif";
  $smilie[9][exemple]=":)";
  $smilie[9][type]=1;
  $smilie[10][code]=":-)";
  $smilie[10][smilie]="smile.gif";
  $smilie[10][exemple]=":-)";
  $smilie[10][type]=1;
  $smilie[11][code]=":O)";
  $smilie[11][smilie]="smile.gif";
  $smilie[11][exemple]=":O)";
  $smilie[11][type]=1;
 
 
  // spécial, retour à la ligne. (le type=0 remplace le $smilie[$n][code] par $smilie[n][smilie] sans rajout de texte autour
  $smilie[12][code]=":BR:";
  $smilie[12][smilie]="<BR>";
  $smilie[12][exemple]="texte:br:à la ligne";
  $smilie[12][type]=0;
 
  $num_smilies=12;
 
return $smilie;
}
 
function codetohtml($texte)
{ global $num_code;
  global $code;
  $comp_texte=StrToUpper($texte);
  $i=0;
  $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
  $pos_fin=strpos($comp_texte,$code[$i][code_fin],$pos_deb);
  //désactivé car dépassement de pile quand actif
//  if ((substr($texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))
//  { //echo $texte;
//    $texte=codetohtml(substr($texte,0,$pos_deb)) . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . codetohtml(substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin));
//  }else
  { $modif=1;
    // tant qu'il y a eu une modification de la chaine de caractère
    while ($modif==1)
    { $modif=0;
      $i=0;
      // on vérifie toute les séries de "balises" conus
      while ($i<=$num_code)
      { { $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
          $pos_fin=strpos($comp_texte,$code[$i][code_fin],$pos_deb);
          // on remplace si balises trouvees
          if ((substr($comp_texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($comp_texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))
          { //echo $texte;
            $texte=substr($texte,0,$pos_deb) . $code[$i][html_debut] . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . $code[$i][html_fin] . substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin);
            $modif=1;
          }
          $i=$i+1;
        }
      }
    }
  }
  return codetosmilie($texte);
}
 
function codetosmilie($texte)
{ global $num_smilies;
  global $smilie;
 
  $ret_texte="";
  // désactivé car dépasement de pile si actif
//  $pos_deb=strpos($comp_texte,$smilie[0][code],0);
//  $pos_fin=strpos($comp_texte,$smilie[0][smilie],$pos_deb);
//  if ((substr($texte,$pos_deb,strlen($code[0][code]))==$code[0][code]) && (substr($texte,$pos_fin,strlen($code[0][smilie]))==$code[0][smilie]))
//  { //echo $texte;
//    $ret_texte=codetosmilie(substr($texte,0,$pos_deb)) . substr($texte,$pos_deb+strlen($code[0][code]),$pos_fin-$pos_deb-strlen($code[0][code])) . codetosmilie(substr($texte,$pos_fin+strlen($code[0][smilie]),strlen($texte)-$pos_fin));
//  }else
  / tant que la chaine n'as pas était toute traité
  { while (strlen($texte)>0)
    { $i=1;
      $j=0;
      $len=0;
      $comp_texte=StrToUpper($texte);
      $pos_select=strlen($comp_texte);
 
      // pour tout les smilies conus
      while ($i<=$num_smilies)
 
      { $position=strpos($comp_texte,$smilie[$i][code],0);
        // on cherche la prochaine position de ce smilie
        if (substr($comp_texte,$position,strlen($smilie[$i][code]))==$smilie[$i][code])
        { if (($pos_select>$position) || (($pos_select==$position) && ($len<strlen($smilie[$i][code]))))
          { // si le smilies plus prés du début de la chaine ou s'il est au même endroit mais plus long alors on indique que c'est celui là et pas le suivant qu'il faudra remplacer
            $pos_select=$position;
            $len=strlen($smilie[$i][code]);
            $j=$i;
          }
        }
        $i=$i+1;
      }
      // si un smilie est a remplacer
      if (substr($comp_texte,$pos_select,strlen($smilie[$j][code]))==$smilie[$j][code])
      { if ($smilie[$j][type]==1)
        {// si code à remplacer par une image
         $ret_texte=$ret_texte.substr($texte,0,$pos_select) . "<IMG SRC=\"/image/smilie/" .$smilie[$j][smilie]. "\" ALT=\"".$smilie[$j][code]."\">";
          // la chaine "/image/smilie/" est à remplacer par le chemin du repértoire ou ce trouve vos smilies
  }else
        {//sinon, on remplace juste le code par le contenus de smilie corespondant
         $ret_texte=$ret_texte.substr($texte,0,$pos_select) . $smilie[$j][smilie];
        }
  $texte=substr($texte,$pos_select+strlen($smilie[$j][code]),strlen($texte)-$pos_select-strlen($smilie[$j][code]));
        $comp_texte=substr($comp_texte,$pos_select+strlen($smilie[$j][code]),strlen($comp_texte)-$pos_select-strlen($smilie[$j][code]));
      }else
      { // si pas de smilie à traiter onn finis de remplir la chaine à retourner  
        $ret_texte=$ret_texte.$texte;
        // et on vide la chaine à traiter pour ijndiquer qu'on a finis le traitement
        $texte="";
      }
    }
  }
  return $ret_texte;
}
 
 
 
 
 
 
 
 
/-------------------------------------------------
---------------/
 
 
 
 
 
EDIT :
 
Heu, éditer mon messge pour voir le code comme il faut.
 
PS: Pour la partie smilie, je travaille avvec une série de 45 codes diférents qui sont tous géré sans problèmes par ce code. ;)
 
PS2: pour empécher qu'une URl soit modifier par mon code, il sufit de créer un smilie de type 0 avec pour code et pour smilie :// (par exemple et ca aura pour effet d'empécher le smili :/ d'interférer l'URL)

 

[edtdd]--Message édité par omega2--[/edtdd]

Reply

Marsh Posté le 03-12-2001 à 23:58:45    

Si vous avez une idée pour optimiser ce dode ou pour l'améliorer, je suis preuneur.
n'hésitez pas à me dire ce que vous en pensez et à me retourner vos expériences si vous essayez de l'utiliser. :)
Personellement, je n'utilises pas ce code chez free car le traitement est ralongé dans certains cas (plus d'une disaine de smilies dans certains des 50 messages que je dois traiter à chaque rechargement du la page) au delà des limites permises par free (qui est de 5 secondes).
En fin de semaine, je ferais des essaies sur multimania à partir des mêmes donées pour vois si ca passe mieux sinon, je me monterais un serveur personel. ;)

Reply

Marsh Posté le 06-12-2001 à 00:50:47    

Suite à un bug dans la fonction de formatage de texte, voilà la version corrigé de la fonction. Désolé pour cette erreur.
 
 
 
 
/----------------------------------------------------------------/
 
 
 
function codetohtml($texte)
{ global $num_code;
  global $code;
 
 
  $i=0;
  $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
  $pos_fin=strpos($comp_texte,$code[$i][code_fin],$pos_deb);
//  if ((substr($texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))
//  { //echo $texte;
//    $texte=codetohtml(substr($texte,0,$pos_deb)) . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . codetohtml(substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin));
//  }else
  { $modif=1;
    while ($modif==1)
    { $modif=0;
      $i=1;
  $comp_texte=StrToUpper($texte);
      while ($i<=$num_code)
      {// if (strlen($code[$i][code_fin])==0)
       // { echo $comp_texte . "<BR>" . $i . "<BR>" .$code[$i][code_deb] . "<BR>";
       //   $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
       //   echo $pos_deb . "<BR>";
       //   if (substr($comp_texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb])
       //   { $texte=substr($texte,0,$pos_deb) . $code[$i][html_debut] . substr($texte,$pos_deb+strlen($code[$i][code_deb]),strlen($texte)-$pos_deb);
       //     echo $texte;
       //     $modif=1;
       //   }    
       // }else
        { $pos_deb=strpos($comp_texte,$code[$i][code_deb],0);
          $pos_fin=strpos($comp_texte,$code[$i][code_fin],$pos_deb);
          if ((substr($comp_texte,$pos_deb,strlen($code[$i][code_deb]))==$code[$i][code_deb]) && (substr($comp_texte,$pos_fin,strlen($code[$i][code_fin]))==$code[$i][code_fin]))
          { $texte=substr($texte,0,$pos_deb) . $code[$i][html_debut] . substr($texte,$pos_deb+strlen($code[$i][code_deb]),$pos_fin-$pos_deb-strlen($code[$i][code_deb])) . $code[$i][html_fin] . substr($texte,$pos_fin+strlen($code[$i][code_fin]),strlen($texte)-$pos_fin);
            $modif=1;
   echo $pos_deb . "<BR>" . $pos_fin . "<BR>";
          }
          $i=$i+1;
        }
      }
    }
  }
  return codetosmilie($texte);
}

Reply

Marsh Posté le 06-12-2001 à 09:48:17    

Ouaih, y-a beaucoup plus court pour faire ce que veux... Expressions Régulières, tu connais !!!
 
@+

Reply

Marsh Posté le 06-12-2001 à 09:48:17   

Reply

Marsh Posté le 06-12-2001 à 10:50:05    

fly LM a écrit a écrit :

Ouaih, y-a beaucoup plus court pour faire ce que veux... Expressions Régulières, tu connais !!!
 
@+  



Je connais mais si on remplis la partie LAT de la balise IMG, on ce retrouve avec des bugs car certains smilies seront traité plusieurs fois comme des smilies différents a moins de remplacer les caractères de la partie ALT par les codes ASCII mais alors, on aura plus les bons caractères sur tout les navigateurs.
Mon chat ayant pour sujet Beos et bientot l'ensemble des Beos like, je ne peux pas me permettre un tel problème.


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 06-12-2001 à 11:01:27    

Là je vois pas trop, mais donne moi un exemple, la source et la source traitée... C'est surement un problème d'écriture de ta Regexp...

Reply

Marsh Posté le 06-12-2001 à 13:23:09    

fly LM a écrit a écrit :

Là je vois pas trop, mais donne moi un exemple, la source et la source traitée... C'est surement un problème d'écriture de ta Regexp...  



Je l'ai pas ici, je te la donerais ce soir.


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 06-12-2001 à 13:24:19    

OK...

Reply

Marsh Posté le 07-12-2001 à 00:04:13    

Voilà un exemple simple :
 
  $texte=eregi_replace(":))","<IMG SRC=\"/image/smilie/biggrin.gif\" ALT=\":))\">",$texte);
  $texte=eregi_replace(":)","<IMG SRC=\"/image/smilie/smile.gif\" ALT=\":)\"> ",$texte);
 
Voilà, si on le met dans cet ordre, la seconde ligne va remplacer le :)) compris entre ALT=" et "> généré par la ligne précédante.
Si on le met dans l'autre sens, le :)) ne sera pas remplacer par le bon smilie et on aura un ) qui va s'afficher à côté du smilie.
 
Une solution temporaire que j'avais trouvé, c'était de mettre un espace autour des smilies dans la chaine de recherche.
L'autre solution que j'avais utiliser c'était de remplacer d'abord le :)) pas une autre série de code équivalente. Le problème c'est que j'étais obliger de vérifier à, chaque fois qu'il n'allais pas y avoir de "colision" entre 2 code de smilies et quand ca arrivais, je devais trouver un moyen de la controuner, j'en ai eu vite marre d'où ma solution plus complexe, mais beaucoup plus souple pour rajouter de nouveaux smilies. :)

Reply

Marsh Posté le 07-12-2001 à 09:52:04    

Moi j'aurais fais un truc comme cela :
 
Un tableau avec les motifs de recherche (le code de tes smilies) et un tableau comportant la chaine de remplacement correspondante.
 
exemple :
 
$chaine = "cbudsbcu %lol% nciodcnd %lol%%code% jdeijez %code% cdsib
cbudsbcu %lol% nciodcnd %LOl%%cOde% jdeijez %codE% cdsib";
 
 
$pattern[0] ='\'%lol%\'i';
$replace[0] ='<img src="lol.gif" alt="%lol%">';
$pattern[1] ='\'%code%\'i';
$replace[1] ='<img src="code.gif" alt="%code%">';
 
$chaine2 = preg_replace($pattern,$replace,$chaine);
 
echo $chaine2;
 
Là, y-a pas de conflit et c'est tout simple, même pour gérer de nouveau smilies...
 
@+

 

[edtdd]--Message édité par fly LM--[/edtdd]


---------------
Le plus long des voyages commence par le premier pas. LAO-TSEU
Reply

Marsh Posté le 07-12-2001 à 10:55:36    

fly LM a écrit a écrit :

Moi j'aurais fais un truc comme cela :
 
Un tableau avec les motifs de recherche (le code de tes smilies) et un tableau comportant la chaine de remplacement correspondante.
 
exemple :
 
$chaine = "cbudsbcu %lol% nciodcnd %lol%%code% jdeijez %code% cdsib
cbudsbcu %lol% nciodcnd %LOl%%cOde% jdeijez %codE% cdsib";
 
 
$pattern[0] ='\'%lol%\'i';
$replace[0] ='<img src="lol.gif" alt="%lol%">';
$pattern[1] ='\'%code%\'i';
$replace[1] ='<img src="code.gif" alt="%code%">';
 
$chaine2 = preg_replace($pattern,$replace,$chaine);
 
echo $chaine2;
 
Là, y-a pas de conflit et c'est tout simple, même pour gérer de nouveau smilies...
 
@+  
 
 



:o Ca marche ça?
A l'arrivé, c'est plus rapide ou plus lent que ma méthode?
Bon, ce soir, je sais quoi tester maintenant. :)


---------------
VIVE L'AMOUR. :)
Reply

Marsh Posté le 07-12-2001 à 11:12:17    

Bha oui, ça marche, question vitesse, je pense aussi que c'est plus rapide que ta méthode, à tester...
 
@+


---------------
Le plus long des voyages commence par le premier pas. LAO-TSEU
Reply

Marsh Posté le 08-12-2001 à 01:42:28    

Bon, comme il me reste encore toute une partie de la V2 de mon chat qu'es pas finis, je n'ai aps fait ce test ce soir, je le ferais une fois que le reste marchera.
Pour le moment, la création des nouvelles fonctionalites (gestions des smileis entre autres) et la mise à niveau du code (l'arrivé de la gestion des modèles m'oblige à retravailler toue les scripts) passe avant l'optimisation du code.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed