Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/02/2011, 22h53   #1
Nouveau Membre du Club
 
Inscription : janvier 2010
Messages : 291
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 291
Points : 28
Points : 28
Par défaut une fonction de generateur de description qui marche mais j'aimerais mieux

j'ai cette fonction qui tourne
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
	function Spin($txt){
    $test = preg_match_all("#\{(.*?)\}#", $txt, $out);
    if (!$test) return $txt;
	$atrouver = array();
    $aremplacer = array();
    foreach($out[0] as $id => $match)
   {
        $choisir = explode("|", $out[1][$id]);
        $atrouver[]=$match;
        $aremplacer[]=trim($choisir[rand(0, count($choisir)-1)]);
    }
 
	return str_replace($atrouver, $aremplacer, $txt);
	}
quand je lance
Code :
1
2
 
echo spin('{Salut|Coucou|hello} jean {ca va?|comment vas-tu ?|bien?} et toi jo {ca va?|comment vas-tu ?|bien?} ');
voici le resultat quand je clique 3 fois dessus
Code :
1
2
3
4
 
hello jean bien? et toi jo bien? 
Salut jean ca va? et toi jo ca va? 
Coucou jean comment vas-tu ? et toi jo comment vas-tu ?
c'est super mais pour chaque phrase générée j'ai toujours le meme mot qui est remplacé dans la phrase
pour
Code :
hello jean bien? et toi jo bien?
c'est bien? qui est remplacé alors que j'aimerais avoir ce genre de phrase
Code :
hello jean bien? et toi jo ca va ?
ca fait 3h que je creuse la tête dessus et fais tout genre de tests sans résultat.Si vous avez une piste cà m'aiderait grandement

encore merci d'avance
bigs3232 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 00h42   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Salut bigs3232,

je me suis penché sur ton problème et bien que je ne sois pas un expert des Regex, je pense avoir trouvé une soluce :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
 
function Spin($txt){
   $match = preg_match_all('#{[^}]*}#', $txt, $out, PREG_OFFSET_CAPTURE);
 
   if ($match == 0) {
      return $txt;
   }
 
   # ar est un tableau : [0] => le bloc de texte entre {} et [1] => offset de position
   foreach($out[0] as $id => $ar) {
      $list = explode('|', trim($ar[0], '{}'));
      shuffle($list);
      $final .= substr($txt, $pos, $ar[1] - $pos) . $list[0];
      $pos = $ar[1] + strlen($ar[0]);
   }
 
   return $final;
 
}
 
echo spin('{Salut|Coucou|hello} jean {ca va?|comment vas-tu ?|bien?} et toi jo {ca va?|comment vas-tu ?|bien?}');
 
?>
En espérant avoir bien saisi ta requête à cette heure tardive.
rawsrc est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 01h33   #3
Nouveau Membre du Club
 
Inscription : janvier 2010
Messages : 291
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 291
Points : 28
Points : 28
ca a l'air pas mal .
quelques bugs constatés
Code :
Undefined variable: pos
Code :
Undefined variable: final
je continue à tester
bigs3232 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 10h43   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Salut,

je te rappelle que cela n'est aucunement un bug mais une alerte -> grosse différence. Le PHP te permet de profiter de l'utilisation de variables sans avoir à les déclarer au préalable. Regarde ici. Sois tu rajoutes avant la boucle foreach ceci :
Code :
1
2
$pos = 0;
$final = '';
Soit tu modifies les alertes en provenance du PHP.
rawsrc est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 14h13   #5
Nouveau Membre du Club
 
Inscription : janvier 2010
Messages : 291
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 291
Points : 28
Points : 28
merci xysyo
j'ai pas compris
il me semble que c'est la meme chose que
et pas compris ce code ni trouvé sur internet une explication claire
quand je fais print_r($out) , je ne comprends pas ce que ca affiche comme résultat
et pas compris cette ligne
Code :
 $final .= substr($txt, $pos, $ar[1] - $pos) . $list[0];
merci xysyo
bigs3232 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 17h44   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Salut,

je t'invite à faire tes essais toi-même et tu verras que dans un regex '#{[^}]*}#' est différent de "#\{(.*?)\}#".
Après pour la décomposition littérale du regex, il y a plein de tutos sur le web comme ici.

Pour le fonctionnement de preg_match_all la doc officielle suffit amplement pour avoir toutes les options possibles : ici.

Citation:
quand je fais print_r($out) , je ne comprends pas ce que ca affiche comme résultat
De même je te renvoie sur la doc officielle de preg_match_all où il est précisé :
Code :
1
2
3
4
5
6
7
PREG_OFFSET_CAPTURE 
 
Si cette option est activée, toutes les sous-chaînes qui satisfont le masque
seront aussi identifiées par leur offset. Notez que cela modifie le format de la 
valeur retournée, puisque chaque élément de réponse devient un tableau 
contenant la sous-chaîne résultat à l'index 0 et l'index de celle-ci dans la 
chaîne subject à l'index 1.
Citation:
$final .= substr($txt, $pos, $ar[1] - $pos) . $list[0];
Ici on remonte la chaine finale par petits bouts tout en remplaçant à la volée les blocs de textes entre accolades dans la chaine d'origine par un des choix possibles. Le reste n'est qu'arithmétique d'offset au sein d'une chaine de texte.
rawsrc est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 21h33   #7
Nouveau Membre du Club
 
Inscription : janvier 2010
Messages : 291
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 291
Points : 28
Points : 28
merci et bravo .j'ai compris PREG_OFFSET_CAPTURE grace à un exemple sur ce lien
http://www.developpez.net/forums/d98...mots-variable/
bigs3232 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h32.


 
 
 
 
Partenaires

Hébergement Web