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 :

Besoin d'un guru de regexp


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut Besoin d'un guru de regexp
    Bonjour,

    J'essai d'exclure (suppriemer) d'un string certains mots et caracctères sans succès.
    Voilà un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <SVCONLINEORDERRESPONSE_RESPONSE1_}{
    tlchcs1 f0 \ltrchcs0 \lang1024\langfe1024
    oproof\langnp2057\insrsid10422574
    _REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_WAYNUMBER>
    Je veux récupérer tout ce qu'il y a entre les < et >. Pour ça, pas de problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/<([^>]+)>/i', $contenu, $matches, PREG_OFFSET_CAPTURE);
    Et le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SVCONLINEORDERRESPONSE_RESPONSE1_}{\\rtlch\\fcs1 \\af0 \\ltrch\\fcs0 \\lang1024\\langfe1024\\noproof\\langnp2057\\insrsid10422574\\charrsid10422574 _REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_WAYNUMBER
    Une fois que j'ai ça, il faut que j'épure la chaine. Le résultat final doit être SVCONLINEORDERRESPONSE_RESPONSE1_REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_WAYNUMBER
    Donc j'ai pensé dans un premier temps de supprimer tous les caractères indésirables style espace, les caractères spéciaux, et les minuscules. Mais ce n'est pas possible à cause des chiffres.
    Alors j'ai pensé à supprimer tous les mots qui ont une minuscule, ou un caractère spécial, mais je n'arrive pas à le faire.

    Avez vous une suggestion svp ? C'est juste un exemple. Les codes que j'essaie de récupérer sont systématiquement en majuscule alors que tout le reste est composé de caractères spéciaux et de minuscule ou encore d'espaces.

    J'espère que vous pourrez me filer un coup de patte

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $str = '<SVCONLINEORDERRESPONSE_RESPONSE1_}{tlchcs1 f0 \ltrchcs0 \lang1024\langfe1024oproof\langnp2057\insrsid10422574_REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_WAYNUMBER>';
     
    preg_match_all('~[A-Z0-9_]~', $str, $matches);
     
    $x = implode('', $matches[0]);
     
    $y = preg_replace('~(_[\d]+)~', '', $x);
    Après faut voir avec tes cas de figure

  3. #3
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    et oui, c'est bien ça le problème. Les chiffres sont nécessaire au sein du code, mais doivent être supprimé sur le reste. compliqué ...
    Je continue de chercher à partir de votre regexp. Si vous avez d'autres idées, je suis preneur.

  4. #4
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    je n'y arrive pas à cause des chiffres. Il n y a aucune possibilité de supprimer un mot complet suivant une pattern recherchée ?

    Exemple:
    Je cherche le caractère { ou } et je supprime le mot complet où se trouve ce caractère

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    T'as remarqué que j'avais modifié mon post...
    Réessaye avec mon code tu devrais avoir ce que tu cherches

  6. #6
    Membre éprouvé Avatar de patrickbaras
    Homme Profil pro
    Informaticien (à sa mémère).
    Inscrit en
    Septembre 2010
    Messages
    525
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien (à sa mémère).
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 525
    Points : 1 103
    Points
    1 103
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $contenu = '<SVCONLINEORDERRESPONSE_RESPONSE1_}{tlchcs1 f0 \ltrchcs0 \lang1024\langfe1024oproof\langnp2057\insrsid10422574_REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_WAYNUMBER>';
    $regexp="#<(.*_)}{[^_]+_(.*)>#s";
    preg_match_all($regexp, $contenu, $contenu2);
    $final=$contenu2[1][0].$contenu2[2][0];
    echo $final;
    donne:
    SVCONLINEORDERRESPONSE_RESPONSE1_REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_WAYNUMBER
    ce message vous a aidé ! Un petit click sur fait toujours plaisir

    "Nos études ont montré que la probabilité qu’un programme corrigé fonctionne comme avant la correction est seulement de cinquante pour cent." Bev Littlewood & Lorenzo Strigini

    "Le logiciel, c’est comme le sexe, c’est meilleur quand c’est libre/gratuit." Linus Torvalds

  7. #7
    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
    Dans le même ordre d'idée que la solution de patrickbaras:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $results = array();
    if (preg_match_all('~<([^\Wa-z]+)_.*?_([^\Wa-z]+)>~s', $data, $matches, PREG_SET_ORDER)):
        foreach ($matches as $match) {
            unset($match[0]);
            $results[] = implode('_', $match);
        }
    endif;
     
    print_r($results);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Bonjour,

    Merci pour toutes ces réponses. J'ai eu un peu de mal à intégrer le code dans les routines existantes, mais c'est pas mal j'avance. Sauf que j'ai toujours un problème.
    Le code fourni ci-dessus est un exemple. Entre les < et > il peut y avoir n'importe quoi. Ci dessus, on commence avec <SVCONLINE... mais il peut exister des codes avec < }{tlch cs1 f0 \ltrch cs0 \lang1024 SVCONLINE...

    Je vais déjà essayer de générer des logs du traitement pour voir où ça pêche et je reviens poster le tout.

    Pour expliquer ce que j'essaie de faire pour que vous compreniez bien, j'essaie d'utiliser des modèles RTF générés depuis word pour générer un fichier final avec des valeurs provenant d'un array.
    Or lorsqu'on génère le code RTF pour le modèle, de manière aléatoire word ajoute des balises entre les < et > alors que sur word, c'est impeccable.

    Du coup, quand je fais ma recherche du code récupéré du modèle RTF pour les remplacer avec les valeurs correspondantes, forcément, je ne trouve rien, donc je remplace avec du vide. pas top lol

    Voilà. Je génère quelques logs et je reviens poster mon code. En tout cas merci pour votre aide.

  9. #9
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    alors voilà. Les codes qui commencent par <SVCONLINE sont bien récupérés avec le code de CosmoKnacki.

    Par contre un code de ce type n'est pas récupéré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <}{\scaps0\caps0\cf2\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs19\loch\f5
    SVCONLINEORDERRESPONSE_}{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\lang1024\langfe1024\noproof\langnp1033\insrsid2049848\charrsid2049848 }RESPONSE1_REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_ADDRESSCOMPLEMENT}{\scaps0\caps0\cf2\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs19\loch\f5
    >}
    Il devrait renvoyer --> SVCONLINEORDERRESPONSE_RESPONSE1_REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_ADDRESSCOMPLEMENT

    Le code:

    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
     
            /* Définition des constantes */
            require_once( './config/defines.php' );
     
            /* Chargement de toutes les classes et autres libs */
            require_once( ROOT_DIR . 'class/cHeaders.php' );
     
            $handle = fopen('data/modeles/modele.rtf','r');
            $contenu = fread($handle,filesize('data/modeles/modele.rtf'));
            fclose($handle);
     
            $contenu = addslashes($contenu);
     
            $results = array();
            if (preg_match_all('~<([^\Wa-z]+)_.*?_([^\Wa-z]+)>~s', $contenu, $matches, PREG_SET_ORDER)):
                    foreach ($matches as $match) {
                            unset($match[0]);
                            $results[] = implode('_', $match);
                    }
            endif;
     
            cTools::displayArray($results);
    ?>
    j'essaie de modifier la regexp. Sinon, pour les autres codes, ça a l'air de fonctionner J'ai encore quelques tests à faire, mais ça a l'air pas mal.

  10. #10
    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
    Il faudrait que tu sois un peu plus clair sur le format de la chaîne à traiter, parce que ça change tout!

    Notamment, combien de parties à récupérer peut contenir une section entre <>? Toujours deux? Un nombre indéterminé?
    Peuvent-elles être situées n'importe où? Ont-elles une longueur minimal? Peuvent-elles commencer par un chiffre?

    Plus tu as une description précise du format, plus tu peux aboutir à une regex robuste et efficace.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Malheureusement, je n'en sais rien. C'est une boite noire word. Voilà ce que je sais:

    - TOUS les codes qui sont saisis manuellement dans les modèles commencent par < et finissent par >
    - TOUS les codes qui sont saisis sont en MAJUSCULE et commencent par SVCONLINE

    De manière aléatoire, à l'enregistrement des modèles, word ajoute (ou pas) du code entre les < et >.
    Je peux donc avoir un code parfait style <SVCONLINEORDERRESPONSE_RESPONSE1_REPORT1_IDENTITYMODULE1_OFFICIALCOMPANYNAME1> comme un code pourri par word du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <}{\scaps0\caps0\cf2\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs19\loch\f5
    SVCONLINEORDERRESPONSE_}{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\lang1024\langfe1024\noproof\langnp1033\insrsid2049848\charrsid2049848 }RESPONSE1_REPORT1_IDENTITYMODULE1_HEADESTABLISHMENT1_ADDRESS1_ADDRESSCOMPLEMENT}{\scaps0\caps0\cf2\expnd0\expndtw0\i0\b0\rtlch \ltrch\loch\fs19\loch\f5
    >}
    Ce que je sais par rapport à ces ajouts intempestifs:
    - Tous ce qui est ajouté contient des minuscules uniquement, des caractères spéciaux, des espaces et des chiffres.
    - La quantité de codes générés par word est complètement aléatoires. Il peut très bien y en avoir 3 blocs, comme il peut y en avoir 5 ou aucun.

    Vous comprenez pourquoi j'ai besoin d'un guru lol C'est vraiment à se taper la tête contre les murs.

  12. #12
    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
    Tu peux essayer d'adapter la pattern précédente comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ~<[^>]*?([^\Wa-z]+)_[^>]*?_?([^\Wa-z]+)>~
    Mais rien ne te garantie qu'il n'y aura pas d'autres chausse-trapes. À toi de les trouver.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. Besoin d'un coup de main avec les regexp .Net
    Par scaleo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 25/06/2007, 10h40
  2. Réponses: 2
    Dernier message: 13/06/2007, 11h03
  3. Besoin d'aide avec Regexp::Assemble
    Par mobscene dans le forum Modules
    Réponses: 5
    Dernier message: 11/04/2007, 12h39
  4. Besoin d'être sûr de ma RegExp
    Par Arioch dans le forum Langage
    Réponses: 16
    Dernier message: 18/06/2006, 12h31
  5. Besoin d'aide avec regexp
    Par goblin dans le forum Langage
    Réponses: 3
    Dernier message: 04/12/2005, 04h27

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