ereg() et preg_replace()

Eléphant du PHP | 71 Messages

29 déc. 2005, 12:01

Bonjour, je fais actuellement un script pour mon site, et je bloque un moment.

J'ai un texte qui contient des balises personnaliser. Voici en gros la structure :

[CAT=nom de la cat]
[TABLEAU]
ligne 1 *
ligne 2 *
[/TALBEAU]

Je veux transformer cela pour qu'il y ait le titre de la catégorie en gras, et en dessous le tableau. Indivicuellement, j'arrive modifier chaque élément, mais lorsque tout cela est ensemble, et surtout, lorsque cela se répète plusieurs fois (plusieurs catégorie les unes en dessous des autres) je bloque, et ça ne marche pas !

J'aimerais donc savoir comment faire pour changer ces données quand elles sont mise ensemble.

Vous pouvez voir le résultat de chaque partie sur cette page : http://astunet.free.fr/test.php

Voici le code que j'utilise pour chaque partie :
<?

$texte1='[TABLE]bonjour tous le monde[/TABLE]';
$texte2="[INFO=je viens manger chez toi à l'aube]";
$texte3='Renan | 19ans *
		Ptrick | 52ans *
		Roger | 68ans';

		

//TEST 1
echo 'TEST N°1: [TABLE]bonjour tous le monde[/TABLE]<br><b>Résultat >>> </b>';
if(eregi("([[])(TABLE)([]])(.*)([[])(/TABLE)([]])", $texte1, $sortie1)) 
{ 
echo '<table width="50%" border="1" bgcolor="#0099FF">
  <tr>
    <td bgcolor="#FFFFFF">'.$sortie1[4].'</td></tr></table>';
}
else { echo 'Cette balise n\'a pas été trouvée'; }

//TEST 2
echo '<p>&nbsp;</p>TEST N°2: [INFO=je viens manger chez toi à l\'aube]<br><b>Résultat >>> </b>';
if(eregi("([[])(INFO)([=])(.*)([]])", $texte2, $sortie2)) 
{ 
echo 'Information : '.$sortie2[4];
}

//TEST 3
echo '<p>&nbsp;</p>TEST N°3: grouper les infos<br><b>Résultat >>> </b>';
$liste=explode("*",$texte3);
$nb=count($liste);
for($i=1; $i<=$nb; $i++)
{
$nb_liste=$i-1;
$liste2=explode("|", $liste[$nb_liste]);
echo 'Nom : '.$liste2[0].'<br>';
echo 'Age : '.$liste2[1].'<br><br><br>';
}

?>
Merci d'avance de vos réponses !

Eléphant du PHP | 153 Messages

29 déc. 2005, 12:30

Si tu sais le faire sur un seul texte tu dois pouvoir le faire sur plusierus

Si tu veux tu peux mettre toutes tes expressions dans un tableau et faire tes tests successivement sur tous les éléments du tableau.

Ou tu veux que ce soit une seule expression?

Eléphant du PHP | 71 Messages

29 déc. 2005, 14:16

En fait, j'aimerais simplement que la texte entier soit traité correctement, car là, dès le premier tableau, ça bloque (le premier tableau est bien ouvert, mais pas refermé, du coup, les infos du 2ème sont mise sur le 1er ...

utiliser des tableaux, tu parles de "array()" ? c'est possible de l'utiliser dans une fonction comme eregi ??

Merci pour vos réponses :wink:

Eléphant du PHP | 153 Messages

29 déc. 2005, 14:41

pour le array

tu peux faire comme ca

<? 

$texte1='[TABLE]bonjour tous le monde[/TABLE]'; 
$texte2="[INFO=je viens manger chez toi à l'aube]"; 
$texte3='Renan | 19ans * 
        Ptrick | 52ans * 
        Roger | 68ans'; 

$tab=array($texte1,$texte2,$texte3);

foreach ($tab as $cle => $texte){         

echo "test n°{$cle+1} {$texte}<br><b>Resultat</b>


if(eregi("([[])(TABLE)([]])(.*)([[])(/TABLE)([]])", $texte, $sortie1)) 
{ 
echo '<table width="50%" border="1" bgcolor="#0099FF"> 
  <tr> 
    <td bgcolor="#FFFFFF">'.$sortie1[4].'</td></tr></table>'; 
} 
else {
if(eregi("([[])(INFO)([=])(.*)([]])", $texte, $sortie2)) 
{ 
echo 'Information : '.$sortie2[4]; 
} 

else{
$liste=explode("*",$texte); 
$nb=count($liste); 
for($i=1; $i<=$nb; $i++) 
{ 
$nb_liste=$i-1; 
$liste2=explode("|", $liste[$nb_liste]); 
echo 'Nom : '.$liste2[0].'<br>'; 
echo 'Age : '.$liste2[1].'<br><br><br>'; 
} }}
}

?> 

J'ai pas testé mais ca doit marcher a peu pres

Eléphant du PHP | 71 Messages

30 déc. 2005, 09:26

C'est bon, j'ai trouvé une solution qui fonctionne bien, avec preg_replace.

Voici ce que j'utilise :
$cherche[0]='/(\[TABLEAU\])/';
$cherche[1]='/(\[\/TABLEAU\])/';
$remplace[0]='<table width="50%" border="1" bgcolor="#0099FF"><tr><td>Nom</td><td>Club</td></tr>';
$remplace[1]='</table><br><br>';

echo preg_replace($cherche,$remplace,$texte);
Merci pour ton aide pitt, elle m'a bien guidée tout de même :wink:.