Page 1 sur 1

Probleme de boucle

Posté : 29 nov. 2005, 15:49
par VaN
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 ?

Posté : 29 nov. 2005, 18:29
par VaN
Image

Posté : 29 nov. 2005, 18:41
par Cyrano
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.

Posté : 29 nov. 2005, 19:11
par VaN
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

Posté : 29 nov. 2005, 19:14
par Cyrano
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

Posté : 29 nov. 2005, 19:16
par VaN
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: )

Posté : 29 nov. 2005, 19:22
par Cyrano
:) [Résolu] :?:

Posté : 29 nov. 2005, 20:19
par VaN
yep