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 actifB::CODE::B: smilie et formatage de texte désactivég: B:CODE::B:smilie et formatage de texte actifB:";
$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]