IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

une fonction de generateur de description qui marche mais j'aimerais mieux [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut une fonction de generateur de description qui marche mais j'aimerais mieux
    j'ai cette fonction qui tourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    hello jean bien? et toi jo bien?
    c'est bien? qui est remplacé alors que j'aimerais avoir ce genre de phrase
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    ca a l'air pas mal .
    quelques bugs constatés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Undefined variable: pos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Undefined variable: final
    je continue à tester

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pos = 0;
    $final = '';
    Soit tu modifies les alertes en provenance du PHP.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
     $final .= substr($txt, $pos, $ar[1] - $pos) . $list[0];
    merci xysyo

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    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.

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    $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.

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    627
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 627
    Par défaut
    merci et bravo .j'ai compris PREG_OFFSET_CAPTURE grace à un exemple sur ce lien
    http://www.developpez.net/forums/d98...mots-variable/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/12/2009, 07h58
  2. [XL-2003] erreur dans une fonction appelée dans excel et qui ecrit dans excel
    Par peeter__steewart dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/08/2009, 15h00
  3. Réponses: 1
    Dernier message: 12/01/2009, 22h00
  4. Script qui marche mais pas elegant[newbie]
    Par billybob2006 dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2005, 12h25
  5. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 22h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo