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 :

méthode de reconnaissance et tri des sous chaines dans une chaine ?


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Points : 14
    Points
    14
    Par défaut méthode de reconnaissance et tri des sous chaines dans une chaine ?
    Bonjour

    J'ai une chaine de caractère irrégulière pouvant contenir les 8 contenus suivants = Nom 1-y1 Telef : x2-y2 C.P. : x3-y3 Ville : x4-y4

    xn = tous caractères sauf retour à la ligne
    yn = tous caractères après un retour à la ligne

    Je cherche la méthode pour générer les 8 sous-chaines suivantes =
    Nom : x1
    y1
    Telef : x2
    y2
    C.P. : x3
    y3et tri
    Ville : x4
    y4

    Si possible les mêmes contenus toujours dans la même position/colonne (donc reconnaître ordonner le bon sous contenu quand il existe, dans la colonne/position appropriée = les y4 devraient donc toujours êtr een position/colonne 8

    On peux passer par fivxrr ou upwxrk pour cela

    SUPER MERCI

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 201
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 201
    Points : 8 426
    Points
    8 426
    Billets dans le blog
    17
    Par défaut
    Je ne comprends pas le rapport entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Nom : x1-y1 Telef : x2-y2 C.P. : x3-y3 Ville : x4-y4
    Et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    xn = tous caractères sauf retour à la ligne
    yn = tous caractères après un retour à la ligne
    Donne quelques exemples concrets et significatifs de ce que tu as en entrée et de ce que tu veux en sortie.

    Une regexp fera certainement l'affaire.

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2009
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 14
    Points : 14
    Points
    14
    Par défaut
    ok merci pour cette première réponse

    Si je pose ce tableau des sous chaines de sortie est-ce plus clair =

    8 sous-chaines de "sortie" =
    1 = Nom : x1
    2 = y1 (possiblement vide)
    3 = Telef : x2
    4 = y2 (possiblement vide)
    5 = C.P. : x3
    6 = y3 (possiblement vide)
    7 = Ville : x4
    8 = y4 (possiblement vide)

    ----------------------------------------
    Exemple = Nom : Dupont Jean \nCélibataire Telef : 0606060606 \n email : jd@jd.fr \n C.P. : 75000 \nVille : Paris \nPropriétaire

    8 sous-chaines de "sortie" =
    1 = Nom : Dupont Jean
    2 = Célibataire
    3 = Telef : 0606060606
    4 = email : jd@jd.fr
    5 = C.P. : 75000
    6 = NULL
    7 = Ville : Paris
    8 = Propriétaire

    La sous chaine 6 = vide

    Merci de votre attention

  4. #4
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 201
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 201
    Points : 8 426
    Points
    8 426
    Billets dans le blog
    17
    Par défaut
    Exemple = Nom : Dupont Jean \nCélibataire Telef : 0606060606 \n email : jd@jd.fr \n C.P. : 75000 \nVille : Paris \nPropriétaire

    8 sous-chaines de "sortie" =
    1 = Nom : Dupont Jean
    2 = Célibataire
    3 = Telef : 0606060606
    4 = email : jd@jd.fr
    5 = C.P. : 75000
    6 = NULL
    7 = Ville : Paris
    8 = Propriétaire
    C'est différent de ce que tu annonçais.

    Ce format est terriblement mauvais, car pas de séparateur entre y et le x suivant.

    Il y a une incohérence avec "Telef" et "email" qui se termine avec "\n".

    En entrée, "\n" est-il un littéral ou un retour à la ligne ?

    Il y a des espaces qui trainent partout, faut-il les prendre en compte ? L'exemple ne semble pas très rigoureux.

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 888
    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 888
    Points : 6 632
    Points
    6 632
    Par défaut
    Avec une chaîne de test à visage humain (sans le saut de ligne aprés l'adresse email conformément à ta description de départ), on peut tenter quelque chose comme ç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
    $s = <<<'END'
    Nom : Dupont Jean 
    Célibataire Telef : 0606060606
    email : jd@jd.fr  C.P. : 75000 Ville : Paris 
    Propriétaire
    END;
     
    $pattern = <<<'END'
    ~
    (?<key_value> [^\s:]+ \h* : \h* [^:\n]* [^:\s]) \h*
    (?| \n \h* (?<option> \S++ (?>\h+\S+)*?) \h* | () ) 
    (?= (?<!\S) \g<key_value> | \z)
    ~xuA
    END;
     
    preg_match_all($pattern, $s, $matches, PREG_SET_ORDER);
     
    $results = array_reduce($matches, fn($c, $m) => [...$c, $m['key_value'], $m['option']], []);
     
    print_r($results);
    demo.
    regex101.

    Pour obtenir une chaîne vide quand une partie optionnelle est absente, j'utilise un groupe branch reset dans lequel les groupes de capture sont les mêmes pour chaque branche de l'alternative (donc () est aussi le groupe "option"). On peut désormais aussi faire autrement sans branch reset en utilisant l'option PREG_UNMATCHED_AS_NULL pour obtenir la valeur null à la place d'une chaîne vide: demo.
    La dernière ligne de la pattern vérifie que suit un autre passage clef/valeur ou la fin de la chaîne de manière à "tirer" le quantificateur non-gourmand *? jusqu'au bon endroit.

    C'est une manière générale de faire les choses sans préciser la succession des clefs, maintenant rien ne t'empêche de reprendre les éléments de la pattern pour en constituer une (utilisable avec preg_match cette fois-ci) qui précisera explicitement la succession des clefs.



    Une version plus efficace et un peu moins brouillonne de la pattern, utilisant les nouveautés syntaxiques de PCRE2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $pattern = <<<'END'
    ~
    (?<key_value>
        [^:\s]++
        \h* : \h*
        [^:\s]++ (*atomic: \h+ [^:\s]+ )*?
    ) \h*+
    ( \n \h* (?<option> \S++ (*atomic: \h+ \S+ )*? ) \h*+ )? 
    (*positive_lookahead: \g<key_value> | \z)
    ~nuxA
    END;
    • le modificateur n permet de considérer les groupes de capture qui ne sont pas nommés comme des groupes non-capturants.
    • Le test avant positif peut s'écrire de trois manières: le bon vieux (?=...), mais aussi en toutes lettres (*positive_lookahead:...) ou en initiales (*pla:...).
    • De même pour le groupe atomic (?>...), on peut écrire (*atomic:...)

Discussions similaires

  1. Ajouter des sous titres dans une combo box
    Par Djaiffe dans le forum VB.NET
    Réponses: 5
    Dernier message: 24/05/2018, 16h55
  2. [AC-2002] Comment calculer des sous-totaux dans une requete croisee
    Par babinou dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/08/2009, 09h43
  3. Afficher des sous-requêtes dans une requête
    Par ZashOne dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 16/04/2008, 10h07
  4. [VB2002] Inclure des sous-repertoires dans une installation
    Par pape0 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/09/2007, 17h48
  5. Réponses: 6
    Dernier message: 25/10/2006, 21h00

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