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 :

Récupérer une chaine de caractères


Sujet :

Langage PHP

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut Récupérer une chaine de caractères
    Bonjour,

    j'essaye de parser un mail. Bon pour l'instant j'enregistre le mail en tant que fichier.

    mon fichier texte ressemble à cela :

    Cher bidule,


    Commande n° : 123-123456-789123456

    Veuillez expédier l'article en mode standard.

    Réf. Offre : 15d2ds1fd5fsdfs
    Votre réf. : 5263252
    Quantité : 1
    Date de la vente : 09/04/2010
    Montant total dû au vendeur : EUR XXX


    Comme vous l’avez accepté, suite à cette commande passée le 09/04/2008, vous disposez de deux jours ouvrés pour expédier ces articles.

    - - - - - - - - - - - - - - - - - - -
    bla bla bla

    mon code
    Je fais donc :
    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
    25
    26
    27
    28
    29
    30
     
     
    $contenu = fopen($nomFichier,777);
     
       $pattern_numItem = "#Votre#";
       $pattern_orderId = "#Commande#";
       $pattern_orderDate ="#Date de la vente :#";
       $mail=array();
     
      if ($contenu)
       {
        while (!feof($contenu))
        {
            $buffer = fgets($contenu, 255);
            if (preg_match($pattern_numItem,$buffer))
            {
                $mail['numItem'] = $buffer;
            }
             if (preg_match($pattern_orderId,$buffer))
            {
                $mail['orderId'] = $buffer;
            }
              if (preg_match($pattern_orderDate_orderId,$buffer))
            {
                $mail['ordeorderDaterId'] = $buffer;
            }
     
        }
     
       }
    Résultat de $mail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Array
    (
        [orderId] => Commande n° : 171-3662065-4475551
        [numItem] => 2. Cliquez sur « Accédez Ã* ...
     
    )
    Donc j'ai bien le orderId , mais comment faire pour n'avoir que le 171-3662065-4475551 ?
    Par contre le numItem c'est pas du tout ça, je n'y connais pas grand chose en expression régulière, comment dois-je faire ?

    Merci beaucoup

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Salut,

    Un truc dans ce genre pourrait te donner des idées :

    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
    25
    26
    27
    <?php
    $str = "Cher bidule,
    
    
    Commande n° : 123-123456-789123456
    
    Veuillez expédier l'article en mode standard.
    
    Réf. Offre : 15d2ds1fd5fsdfs
    Votre réf. : 5263252
    Quantité : 1
    Date de la vente : 09/04/2010
    Montant total dû au vendeur : EUR XXX
    
    
    Comme vous l’avez accepté, suite à cette commande passée le 09/04/2008, vous disposez de deux jours ouvrés pour expédier ces articles.";
     
    $reg = '#Commande n° : ([\d-]+).+
    Votre réf\. : (\d+).+
    Date de la vente : (\d\d/\d\d/\d{4})#s';
     
    preg_match($reg, $str, $m);
    print_r($m[1]);
    print("\n");
    print_r($m[2]);
    print("\n");
    print_r($m[3]);

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Bonjour,



    Tu utilises preg_match() comme un détecteur et tu remplis chaque case du tableau $mail avec une ligne allumant un détecteur particulier: chaque remplissage de case, nécessite son test propre avec une RE particulière et est mené indépendamment des autres.

    Alors que preg_match() est capable de construire tout seul et d’un seul coup un tableau recensant différents groupes, à condition d’écrire une RE qui comporte la définition de ces groupes.



    C’est ce qu’a fait snafu.

    Mais j’y apporterais ce que je considère comme une amélioration: plus il y a des caractères explicites dans une RE, mieux c’est, car plus rapide, et plus sûr.

    J’écrirais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $reg = '#Commande n° : ([\d-]+)
     
    Veuillez expédier l'article en mode [^\n]+
     
    Réf. Offre : \w+
    Votre réf\. : (\d+)
    Quantité : \d+
    Date de la vente : (\d\d/\d\d/\d{4})#';
    sans nécessité l’option ’s’.





    De plus , il faut traiter le problème du contenu «2. Cliquez sur « Accédez Ã* ...» dans la case [numItem]

    Il semble que le texte sur lequel tu appliques la recherche ne soit pas un texte brut mais le texte résultant de l’interprétation d’un texte sous-jacent qui comporte un lien dans la ligne «Votre réf. : 5263252»
    Il faut donc construire la regex sur la base du texte source et non pas seulement du texte interpété.
    C’est comme ça que je comprends les choses.

    Quel est le code source de ton formulaire ?

  4. #4
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Mais j’y apporterais ce que je considère comme une amélioration: plus il y a des caractères explicites dans une RE, mieux c’est, car plus rapide, et plus sûr.
    C'est cependant moins flexible. Un changement dans le texte d'expédition et le motif plus fermé ne fonctionne plus.
    C'est une question de choix entre sûreté et flexibilité.
    On pourrait aussi dire en rapidité, eyquem à aussi raison sur ce fait, mais vu le traitement dont il s'agit, ça doit se jouer en micro-secondes...

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658
    Par défaut
    Certes. Mais une regex est elle destinée à être flexible ?

    Le principe d’une regex est de d’attraper de la variabilité en la repérant par rapport à de la rigidité qui l’entoure.
    Si on ne matche pas de façon stricte des portions de texte qui n'intéressent pas, on en fait des portions qui ne sont ni d’une variabilité à capturer, ni rigides. Ce sont des portions de remplissage en quelque sorte.

    Il est certain qu’avec la regex telle que tu la construis, un changement qui tombe dans une portion de remplissage ne rendra pas inefficace la regex.
    C’est fort bien si le changement ne se répercute pas dans les résultats d’une manière ou d’une autre.

    Mais supposons que le formulaire change par exemple avec l’apparition d’une ligne tout en haut, suite à une adaptation du service:

    Commande n° : 13
    de statut: Urgentissime



    Cher bidule,


    Commande n° : 123-123456-789123456

    Veuillez expédier l'article en mode standard.

    Réf. Offre : 15d2ds1fd5fsdfs
    Votre réf. : 5263252
    Quantité : 1
    Date de la vente : 09/04/2010
    Montant total dû au vendeur : EUR XXX
    La regex marchera, certes, mais on se retrouvera avec un numéro qui n’est pas celui souhaité au départ.


    Tandis qu’avec ma regex, ça plantera et on en sera conscient tout de suite.

    Il est même judicieux de prévoir de traiter le cas de non matching, on évitera ainsi à la fois d’enregistrer des données erronées sans s’en apercevoir, et de planter quand la flexibilité ne sera plus suffisante pour absorber un changement sans conséquence.



    Donc oui, c’est un choix entre sécurité et flexibilité, mais pour moi ça me paraît ètre diablement synonyme de choix entre rigueur ou laxisme à la “tant que ça marche“.







    D’autre part, j’ai testé les vitesses (avec un code en Python).
    Je suis surpris de la netteté de la différence de temps d’exécution en valeurs relatives:
    64 % de plus avec la RE de snafu.

    Mais je suis d’accord avec snafu: en valeurs absolues, la différence est au plus de l’ordre de 10E-6 secondes.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    bonjour, et merci pour vos réponses..

    mais je n'ai pas de formulaire, il s'agit de texte dans un fichier texte.
    j'ai finalement fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ref = utf8_encode('Votre réf');
    $cmd = utf8_encode('Commande n°');
       $pattern_numItem = "#^".$ref."#";
       $pattern_orderId = "#^".$cmd."#";
       $pattern_orderDate ="#^Date de la vente#";
    Je récupère donc les lignes :
    votre commande : numero,
    votre ref : numero

    de ça je fais un explode sur la chaine et separateur : pour avoir les infos, mais niveau sécurité c'est très très moyen...

Discussions similaires

  1. [MySQL] Récupérer une chaine de caractère dans un colonne
    Par djdamage dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 29/07/2009, 15h40
  2. [RegEx] Récupérer une chaine de caractères
    Par lucke34 dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2009, 15h19
  3. [RegEx] Récupérer une chaine de caractéres par strpos
    Par bdptaki dans le forum Langage
    Réponses: 11
    Dernier message: 21/04/2009, 11h43
  4. Réponses: 5
    Dernier message: 22/06/2006, 17h19
  5. Récupérer une chaine de caractère dans une page
    Par BrunS dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2005, 14h28

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