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 :

Traitement de valeurs $0


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 264
    Points : 141
    Points
    141
    Par défaut Traitement de valeurs $0
    Bonjour,

    Des expressions arrivent en boucle. Certaines comportent plusieurs mots, mais il existe aussi des doublons de mots seuls.
    1ère expression => sauce tomate basilic
    ===>Traitement de la phrase en boucle: La <b>sauce tomate au basilic</b> c'est très bon mais les tomates doivent être fraîches
    2ère expression => tomate
    ===>Traitement de la phrase en boucle: La <b>sauce <b>tomate</b> au basilic</b> c'est très bon mais les <b>tomates</b> doivent être fraîches

    [/quote]
    Pour remédier au pb, je cherche donc à appliquer un tag « _+_ » entre les mots ce qui n'est pas réellement un soucis puisqu'un simple str_ireplace(' ','_+_',$mot); suffirait puis le remplacer dans la chaine...

    Non, le soucis c'est le respect de la casse dans la chaine, donc exemple de résultat souhaité:
    1ère expression => sauce tomate basilic
    ===>Traitement de la phrase en boucle: La <b>sauce tOmaTe au basilic</b> c'est très bon mais les tomates doivent être fraîches
    2ère expression => tomate
    ===>Traitement de la phrase en boucle: La <b>sauce tOmaTe au basilic</b> c'est très bon mais les <b>TomAtEs</b> doivent être fraîches
    j'ai pensé qu'il valait mieux traiter la chaine avant de traiter les mots et un simple regex suffira a faire la différence grace au tag de séparation... mais je ne sais traiter cela au niveau du $0 pour créer une séparation entre les expressions comportant plusieurs mots tout en respectant la casse de la chaine, un peut comme la bétise suivante mais qui permet au moins de comprendre le pb et solution recherchée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    preg_replace($regex,'_+_$0_+_', $chaine); // bétise
    $chaine = preg_replace($regex,str_replace(' ','_+_','$0'),$chaine);
    En espérant avoir été suffisamment explicite ...

    Merci d'avance pour vos conseils.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Assez massif !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <?php
     
    $phrase = "La sauce tomate au basilic c'est très bon mais les tomates doivent être fraîches et il faut plus qu'une seule tomate fraîche";
     
    $regex = '@\b(sauce( (des|de|la|au|aux))* tomate( (?3))* basilic|tomate)\b@i';
     
    echo preg_replace($regex, '<b>$0</b>', $phrase);
     
    ?>
    Peut-être préférable d'émuler un skip sur le texte déjà balisé via preg_replace_callback ?

    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
     
    $phrase = "La sauce tomate au basilic c'est très bon mais les tomates doivent être fraîches et il faut plus qu'une seule tomate fraîche";
     
    $regles = array(
                '\bsauce( (des|de|la|au|aux))* tomate( (?2))* basilic\b',
                '\btomate\b'
              );
     
    function my_callback($array)
    {
      if ($array[0]{0} == '<') return $array[0];
      return sprintf('<b>%s</b>', $array[0]);
    }
     
    foreach ($regles as $regle) {
      $regex = sprintf('@<b>.*?</b>|%s@i', $regle);
      $phrase = preg_replace_callback($regex, 'my_callback', $phrase);
    }
     
    echo $phrase;
     
    ?>
    Comme d'habitude, je suis nulle en explication

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 264
    Points : 141
    Points
    141
    Par défaut
    Salut!,

    En fait ce n'est pas vraiment ça puisque le segond mot (tomate) arrive ensuite (boucle) pour être traitée dans la chaine, l'ensemble du code est déja trop avancé et je ne peux pas revenir en arrière. Le pb se trouve dans les espaces entre les mots déja traités. j'ai cherché plusieurs solutions pour faire un truc du gente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $phrase = preg_replace($regex, preg_replace('#( )#','_','$0'), $phrase)
    Mais ça ne donne rien.

    De plus, dans ton exemple, je ne suis pas parvenu a inclure un title sans provoquer une erreur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut

    Citation Envoyé par ctrl+z Voir le message
    En fait ce n'est pas vraiment ça puisque le segond mot (tomate) arrive ensuite (boucle) pour être traitée dans la chaine,
    J'en comprends que le mot unique "tomate" est d'abord remplacé et ensuite "sauce tomate au basilic"... est-ce ton cas ?

    Citation Envoyé par ctrl+z Voir le message
    l'ensemble du code est déja trop avancé et je ne peux pas revenir en arrière. Le pb se trouve dans les espaces entre les mots déja traités. j'ai cherché plusieurs solutions pour faire un truc du gente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $phrase = preg_replace($regex, preg_replace('#( )#','_','$0'), $phrase)
    preg_replace_callback peut faire ça... tout code PHP que tu veux y compris "preg_replace" et "str_replace". Tu peux voir preg_replace_callback comme une façon d'injecter du code PHP dans preg_replace.


    Citation Envoyé par ctrl+z Voir le message
    De plus, dans ton exemple, je ne suis pas parvenu a inclure un title sans provoquer une erreur:

    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
    <?php
     
    $phrase = "La sauce tomate au basilic c'est très bon mais les tomates doivent être fraîches et il faut plus qu'une seule tomate fraîche";
     
    $regles = array(
                '\bsauce( (des|de|la|au|aux))* tomate( (?2))* basilic\b',
                '\btomate\b'
              );
     
    function my_callback($array)
    {
      if ($array[0]{0} == '<') return $array[0];
      return sprintf('<a href="#" title="???">%s</a>', $array[0]);
    }
     
    foreach ($regles as $regle) {
      $regex = sprintf('@<a href="#" title="???">.*?</a>|%s@i', $regle);
      $phrase = preg_replace_callback($regex, 'my_callback', $phrase);
    }
    echo $phrase;
     
    ?>
    Les méta-caractères doivent être échappés dans la regex et le point d'interrogation est un méta-caractère. Personnellement je ne testerais pas les attributs du <a>.

    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
     
    <?php
     
    $phrase = "La sauce tomate au basilic c'est très bon mais les tomates doivent être fraîches et il faut plus qu'une seule tomate fraîche";
     
    $regles = array(
                '\bsauce( (des|de|la|au|aux))* tomate( (?2))* basilic\b',
                '\btomate\b'
              );
     
    function my_callback($array)
    {
      if ($array[0]{0} == '<') return $array[0];
      return sprintf('<a href="#" title="%s">%s</a>', $array[0], $array[0]);
    }
     
    foreach ($regles as $regle) {
      $regex = sprintf('@<a .*?>.*?</a>|%s@i', $regle);
      $phrase = preg_replace_callback($regex, 'my_callback', $phrase);
    }
    echo $phrase;
     
    ?>

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 264
    Points : 141
    Points
    141
    Par défaut
    Merci pour tes éclaircissements j'avoue ne jamais avoir utilisé preg_replace_callback(), cette fonction ouvre de nombreuses possibilités...

    je ne comprend pas <a .*?>.*?</a>, ou du moins quelques parties restent un peu flou.

    Merci

Discussions similaires

  1. Traitement sur valeur dans un fichier
    Par michelS dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 06/03/2013, 13h04
  2. Traitement de valeurs dans tableau : où est l'erreur
    Par yoshik dans le forum Débuter
    Réponses: 2
    Dernier message: 14/05/2010, 13h01
  3. Copie/insertion/traitement de valeurs
    Par gdev7 dans le forum SQL
    Réponses: 4
    Dernier message: 17/09/2008, 14h19
  4. Réponses: 3
    Dernier message: 06/05/2008, 15h12
  5. [Tableaux] Traitement des valeurs d'une CheckBox
    Par Alex70 dans le forum Langage
    Réponses: 12
    Dernier message: 18/04/2007, 17h38

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