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 :

Recupérer le prix ou % [RegEx]


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 56
    Points : 30
    Points
    30
    Par défaut Recupérer le prix ou %
    Bonjour tout le monde !

    je vous écris car j'ai un grand besoin d'aide qui me pénalise beaucoup !
    Voila j'ai une liste de phrases diverses et variées et je dois récupérer dedans (si ça existe) le prix ou le poucentage de prix.

    ci-joint un echantillon de phrases

    - Livraison offerte et -10% supplémentaires sur l'offre VAGUE
    -5.2€ de réduction
    -promo: 50€ de réduction sur l'offre
    - Decouverte: 50 € de réduction sur les résidences
    - Code promo erouine
    - Fleur - 3 € de réduction ......
    - 2 euros sur la commande de fleurs



    L'idée, c'est qu'il peut y avoir de tout "50€, 50 €, -10%, 10%, 5.2€, 5,3 euros ...."


    Pour récupérer l'info j'ai fais :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    foreach ($data->promo as $promo) {
     
     $titre = $promo->titre;
     
    /*le prix ou reduc est dans le titre*/
       $reducFinal = $titre;
     
       preg_match_all('/(\d+(?:[\.,][\d]{2})?)\s*[€|%|euros]/', $reducFinal, $matches);
      print_r($matches[0]);
       $reducFinal = $matches[0];
     
    }


    et quand je lance mon script il m'affiche juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => 10% ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( )  Array ( )
    première question : Snif pourquoi il ne récupère qu'une promo ? =(

    contente d'avoir au moins le 10% je fais mon insert en bdd, mais la il m'enregistre juste "array" =( ahhhhhhhhhhhhhhhhhhhh


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ajout = "    INSERT INTO prix(`idcode` ,`marque`, `reduc` )
                   VALUES ('','$marque',  '$reducFinal')
                ";

    Vous l'aurez compris je suis nulle et novice =(

    Depuis ce matin je m'arrache les cheveux sur ce script =(

    Si quelqu'un à un moment de pitié pour m'aider à récupérer les prix et a enregistrer les infos en bdd


    un grand merci !!!

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Essayes avec ça:

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/([0-9]+(?:[.,][0-9]{1,2})?)\s*(?:[€%]|euros?)/u', $reducFinal, $matches);


    Quelques remarques:

    J'ai ajouté le modifieur /u qui indique au moteur de regex qu'il doit traiter la chaîne de caractère comme de l'utf8, ce qui devrait faciliter les choses en ce qui concerne le caractère .

    D'autre part, j'ai remplacer tous les \d par [0-9] car dans ce contexte \d ne contient pas seulement 0123456789 mais aussi les chiffres d'autres alphabets des quatre coins du monde, ce qui risque de ralentir un peu le travail du moteur de regex.

    Écrire [€|%|euros] n'a aucun sens! Une classe de caractère est juste un fourre-tout dans lequel on met des caractères isolés abc, des rangs de caractère a-z ou bien d'autres classes de caractères prédéfinies comme \w ou \s. Il n'y a aucun ordre à l'intérieur et les caractères spéciaux habituels d'une regex perdent leur sens et sont vus comme de simple litéraux.

    Autrement dit [€|%|euros] est strictement équivalent à [eorsu€%|], on ne peut pas y mettre des mots et encore moins y définir des alternatives.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 56
    Points : 30
    Points
    30
    Par défaut
    Bonjour CosmoKnacki !

    merci beaucoup de vouloir m'aider !!

    par contre il a pas dû apprécier le "/u " car il me fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: preg_match_all() [function.preg-match-all]: Compilation failed: invalid UTF-8 string at offset 34
    ça te parle ?

    merci beaucoup en tout cas pour ta gentillesse !

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 56
    Points : 30
    Points
    30
    Par défaut
    PS : j'ai testé en retirant le " u " au cas ou et ça me fait =(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => 10% ) Array ( ) Array ( ) Array ( ) Array ( ) Array ( )

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je vois deux solutions possibles.

    La première consiste à vérifier que l'éditeur de texte que tu utilises enregistre tes fichiers en utf8.

    La deuxième consiste à remplacer le symbole € par son code: \x{20AC}.

    Une autre option un peu moins clean est de remplacer le symbol € par la classe de caractère contenant tous les symboles monétaires: \p{Sc}.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 56
    Points : 30
    Points
    30
    Par défaut
    Re !!

    j'ai mis mon fichier en UTF-8 et remplacé le € par "euros"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	 $titre = str_replace("€", "euros", $titre);
     
       $reducFinal = $titre;
    preg_match_all('/([0-9]+(?:[.,][0-9]{1,2})?)\s*(?:[€%]|euros?)/u', $reducFinal, $matches);
     
    print_r($matches[0]);
    $reducFinal = $matches[0];
    cette fois ca marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => 10% ) Array ( [0] => 5euros ) Array ( [0] => 50euros ) Array ( [0] => 50euros ) Array ( ) Array ( [0] => 3 euros )


    sauf que quand je fais un insert dans ma base


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ajout = "    INSERT INTO prix(`idcode` ,`marque`, `reduc` )
                   VALUES ('','$marque',  '$reducFinal')
                ";

    il me met dans ma table "Array" =( sais tu pourquoi ?
    car je vois bien mes chaines 50 euros .... =(


    encore mercii en tout cas !!

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 56
    Points : 30
    Points
    30
    Par défaut
    Alors j'ai mieux ^^


    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
    $titre = str_replace("€", "euros", $titre);
     
       $reducFinal = $titre;
    preg_match_all('/([0-9]+(?:[.,][0-9]{1,2})?)\s*(?:[€%]|euros?)/u', $reducFinal, $matches);
     
    foreach ($matches as $val) {
     
       var_dump($val[0]);
     
    $ajout = "    INSERT INTO prix(`idcode` ,`marque`, `reduc` )
                   VALUES ('','$marque',  '$val[0]')
                ";
     
     
    }


    par contre je ne comprends pas pourquoi il m'affiche :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string(3) "10%" string(2) "10" string(6) "5euros" string(1) "5" string(7) "50euros" string(2) "50" string(7) "50euros" string(2) "50" NULL NULL string(7) "3 euros" string(1) "3"

    pourquoi ca affiche 10 ? et pas juste 10% je comprends pas ces doublons =(

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je pense qu'il serait bon que tu jettes un œil sur le manuel PHP à propos de la function preg_match_all ce qui devrait te donner la solution à tes problèmes.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2009
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 56
    Points : 30
    Points
    30
    Par défaut
    merciii !!
    c'est bon tout marche !!!

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

Discussions similaires

  1. [MySQL] recupérer le prix par la session ou la bdd ?
    Par keokaz dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 17/07/2010, 10h12
  2. [Indy TCPClient] Recupérer le données reçues
    Par fandor7 dans le forum Web & réseau
    Réponses: 8
    Dernier message: 29/06/2003, 21h52
  3. [Winsock] Envoi et recupération d'une image
    Par arnolanf dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/11/2002, 08h49
  4. recupèrer file d'attente d'impression
    Par magic corp. dans le forum Langage
    Réponses: 2
    Dernier message: 25/09/2002, 14h12
  5. comment puis-je recupérer l'extesion du fichier?
    Par mirella dans le forum Langage
    Réponses: 7
    Dernier message: 14/08/2002, 15h56

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