Le forum de la communauté PHP !
Vous n'êtes pas identifié.
Bonjour.
Je voudrais, à partir d'une chaîne comme
$texte = "Ceci est {g}en gras{/g} !"
la transformer en
$texte = "Ceci est <b>en gras</b> !"
La commande
$texte = ereg_replace('{g}(.+){/g}','<b>\\1</b>',$texte);
fonctionne alors très bien.
Mon problème est que pour une chaîne telle
$texte = "Ceci est {g}en gras{/g} et encore {g}en gras{/g} !"
j'obtiens alors
$texte = "Ceci est <b>en gras{/g} et encore {g}en gras</b> !"
ce qui n'est pas ce que je veux.
Je sais que pour un exemple aussi basique je pourrais utiliser plutot la commande str_replace.
Mais j'ai d'autres cas plus complexes sous le coude que je ne résoudrai que si j'arrive à corriger ce problème avec ereg_replace.
Merci par avance de vos lumières.
Thomas.
Hors ligne
Bonjour,
En commençant par faire un explode de ta chaîne puis en faisant une boucle de vérification, tu dois pouvoir gérer avec ereg_replace :
$texte = "Ceci est {g}en gras{/g}et encore {g}en gras{/g} !";
// On découpe la chaîne de caractère au niveau des espaces
$explode_texte = explode(" ", $texte);
// On réinitialise la variable texte
$texte="";
// On crée une boucle qui va lire le tableau explode_texte
for($i=0;$i<count($explode_texte);$i++){
// On vérifie s'il existe la chaîne {g} dans le tableau
if(ereg('{g}',$explode_texte[$i])){
$texte .= " ".ereg_replace('{g}','< b>',$explode_texte[$i]);
}
// On vérifie s'il existe la chaîne {/g} dans le tableau
elseif(ereg('{/g}',$explode_texte[$i])){
$texte .= " ".ereg_replace('{/g}','< /b>',$explode_texte[$i]);
}
// On vérifie s'il n'existe pas les chaînes {g} ou {/g} dans le tableau,
else{
$texte .= " ".$explode_texte[$i];
}
}
Je ne sais pas si ça te suffira mais j'ai testé et ça a l'air de fonctionner ![]()
Hors ligne
Ton idée fonctionne sans doute, même si elle contourne un peu le problème, à savoir modifier l'expression régulière pour obtenir le résultat attendu.
Mais ça coince pour mes cas plus évolués.
Par exemple pour
$texte = "Ceci est {{un lien1 | http://adresse1}} et encore {{un lien2 | http://adresse2}} !";
traité par
$texte = ereg_replace('{{(.+) \| (.+)}}','<a href="\\2">\\1</a>',$texte);
je ne peux pas me permettre de couper la chaîne suivant les espaces.
Je pense que dans le '{{(.+) \| (.+)}}' ou le '{g}(.+){/g}' il faut interdire une série de caractères telle '{{' ou '{g}' mais je n'y arrive pas.
Une autre idée ?
Hors ligne
Hum j'y vois plus clair ![]()
Est-ce que par exemple tu pourrais avoir quelque chose comme ça :
$texte = "Ceci est {{{un lien1 | http://adresse1 | target1}}} et encore {{{un lien2 | http://adresse2 | target2}}} !";
le nombre d'accolades est-il proportionnel au nombre de paramètres ? dans ce cas, peut-on aller jusqu'à n accolades ?
Hors ligne
sacricri a écrit:
le nombre d'accolades est-il proportionnel au nombre de paramètres ? dans ce cas, peut-on aller jusqu'à n accolades ?
Non, j'ai fixé le nombre d'accolades à 2 mais c'est une pure convention.
Si ça t'arranges on peu prendre
$texte = "Ceci est {un lien1 | http://adresse1} et encore {un lien2 | http://adresse2} !";
traité par
$texte = ereg_replace('{(.+) \| (.+)}','<a href="\\2">\\1</a>',$texte);
Mais ça ne change rien à l'affaire.
Au lieu de transformer chaque paire d'accolades il regroupe tout entre la première accolade ouvrante et la dernière accolade fermante... Et je ne trouve pas comment éviter ceci...
Hors ligne
alors j'ai un truc qui à l'air de marcher, a toi de me dire :
$texte = "Ceci est {un lien1 | http://adresse1} et encore {un lien2 | http://adresse2} et encore {un lien3 | http://adresse3} !";
// On découpe la chaîne de caractère au niveau des espaces
$explode_texte = explode("{", $texte);
$explode_texte2=array();
$a=array();
$b=array();
$texte="";
// On crée une boucle qui va lire le tableau explode_texte
for($i=0;$i<count($explode_texte);$i++){
if(ereg('}',$explode_texte[$i])){
$table = explode("}", $explode_texte[$i]);
$explode_texte2[$i] = $table[0];
array_push($a,$i);
$b[$i]=$table[1];
}else{
$b[$i]=$explode_texte[$i];
}
}
for($j=0;$j<count($a);$j++){
$explode_texte2[($a[$j])] = "{".$explode_texte2[($a[$j])]."}";
$explode_texte2[($a[$j])] = ereg_replace('{(.+) \| (.+)}','<a href="\\2">\\1</a>',$explode_texte2[($a[$j])]);
}
for($i=0;$i<count($explode_texte);$i++){
if($a[$i]==($i+1)){
$b[$i]=$b[$i].$explode_texte2[($a[$i])];
}
}
for($e=0;$e<count($b);$e++){
$texte.=$b[$e];
}
echo $texte;Hors ligne