Probleme de boucle

VaN
Mammouth du PHP | 1107 Messages

29 nov. 2005, 15:49

Bonjour,

J'ai une fonction qui me permet de tranformer des pseudo de joueurs que j'ai sortit d'une bdd en lien vers sa fiche personnelle.

Voici la fonction :
$tab = '';
	$i = 1;
	$texte = 'OliGan zrtgfery ttgh dg ge. wolf ef ghy htrhyrju yrj. FaTC fsgsfg . OliGan sfdgfg';
	// on seek les pseudo ds la base
	$sql = "SELECT id, pseudo FROM membres WHERE disp_site='Y'";
	$query = mysql_query($sql);
	while ($result = mysql_fetch_array($query))
	{
		// creation du tableau avec toutes les reponses de la bdd
		$tab[] = array(	"pseudo"	=>	$result['pseudo'],
						"id"		=>	$result['id'],
						"i"			=>	$i);
		$i++;
	}
	// pour chaque ligne du tableau
	foreach ($tab as $result)
	{
		// Si on trouve le pseudo dans le texte
		if (strstr($texte, $result['pseudo']) == TRUE)
		{
			$cut = explode($result['pseudo'], $texte);
			$debut = $cut[0];
			// si il y'a un tag
			if (substr($debut, -1) == '|')
			{
				$tag = substr($debut, -5);
				$result['pseudo'] = $tag.$result['pseudo'];
				$debut = explode($tag, $debut);
				$debut = $debut[0];
				$fin = $cut[1];
			}
			// sinon
			else
			{
				$fin = $cut[1];
			}
			//creation du lien
			$result['pseudo'] = "<a href=\"".$_SERVER['PHP_SELF']."?cat=memb&id=".$result['id']."\">".$result['pseudo']."</a>";
			// on recompose le texte
			$texte = $debut.$result['pseudo'].$fin;
		}
	}
	echo $texte;
Le probleme que je recontre : Si jamais le pseudo est présent plus d'une fois dans le texte, le deuxieme lien ne se fait pas sur ce dernier, et pire, mon texte est coupé juste avant l'apparition de ce pseudo.
Normal, puisque j'utilise un foreach() sur mon tableau.

Comment puis-je faire pour que la fonction fonctionne meme si le pseudo se repete ?

VaN
Mammouth du PHP | 1107 Messages

29 nov. 2005, 18:29

Image

Mammouth du PHP | 19672 Messages

29 nov. 2005, 18:41

Il serait plus avisé d'utiliser preg_replace pour changer tous les exemplaires dans un texte... De la manière dont tu as fait ça, à la première occurrence trouvée, le texte est coupé en 3, le début, le pseudo et la fin, sans vérification si la fin contient éventuellement encore des occurences.

Autre option: en faire une fonction récursive qui s'appelle elle-même avec la fin en paramètre.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

VaN
Mammouth du PHP | 1107 Messages

29 nov. 2005, 19:11

Je viens de rajouter $texte = str_is_member($fin); juste avant la ligne echo $texte; mais ça ne change rien :/

j'ai ensuite essayé avec preg_replace, mais j'ai un message d'erreur :
<?php
$bdd=mysql_connect("localhost","root","");
mysql_select_db("base_gg",$bdd);

	$tab = '';
	$i = 1;
	$texte = 'OliGan zrtgfery ttgh dg ge. wolf ef ghy htrhyrju yrj. FaTC fsgsfg . OliGan sfdgfg';
	// on seek les pseudo ds la base
	$sql = "SELECT id, pseudo FROM membres WHERE disp_site='Y'";
	$query = mysql_query($sql);
	while ($result = mysql_fetch_array($query))
	{
		// creation du tableau avec toutes les reponses de la bdd
		$tab[] = array(		"pseudo"	=>	$result['pseudo'],
							"id"		=>	$result['id'],
							"i"			=>	$i);
		$i++;
	}
	// pour chaque ligne du tableau
	foreach ($tab as $result)
	{
		// Si on trouve le pseudo dans le texte
		if (strstr($texte, $result['pseudo']) == TRUE)
		{
			$cut = explode($result['pseudo'], $texte);
			$debut = $cut[0];
			// si il y'a un tag
			if (substr($debut, -1) == '|')
			{
				$tag = substr($debut, -5);
				$result['pseudo'] = $tag.$result['pseudo'];
			}
			$pseudo = $result['pseudo'];
			$lien = "<a href=\"".$_SERVER['PHP_SELF']."?cat=memb&id=".$result['id']."\">".$result['pseudo']."</a>";
			$texte = preg_replace($pseudo, $lien, $texte);
		}
	}
	echo $texte;
?>
Warning: Delimiter must not be alphanumeric or backslash in c:\program files\easyphp1-7\www\web_gg\_test\fonctions.php on line 35

Mammouth du PHP | 19672 Messages

29 nov. 2005, 19:14

Attention, les PCRE doivent être délimitées:
            $pseudo = "#". $result['pseudo'] ."#";
            $lien = "<a href=\"".$_SERVER['PHP_SELF']."?cat=memb&id=".$result['id']."\">".$result['pseudo']."</a>";
            $texte = preg_replace($pseudo, $lien, $texte);
Essaye comme ça
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

VaN
Mammouth du PHP | 1107 Messages

29 nov. 2005, 19:16

Oh My God ! ça marche nickel.. et moi qui m'etait prit la tête à découper mon texte (et en plus j'etais trop fier d'avoir trouver cette technique :oops: )

Mammouth du PHP | 19672 Messages

29 nov. 2005, 19:22

:) [Résolu] :?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

VaN
Mammouth du PHP | 1107 Messages

29 nov. 2005, 20:19

yep