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 :

Extraire plusieurs partie d'une chaîne de caractères. [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut Extraire plusieurs partie d'une chaîne de caractères.
    Bonjour à tous,

    je suis débutant en regex donc si l'un d'entre vous a de bon tutos ou autre je suis toujours preneur d'un lien.

    Pour en revenir au but de mon post je souhaite récupérer plusieurs parties dans une chaîne de caractères

    par exemple voici ma chaîne de caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'Mr et Mme Dupont sont les parents de pierre, paul et jack.'
    J'aimerais donc récupérer dans un tableau le nom des parents et tous les prénoms des enfants.
    J'ai tout d'abord essayer avec preg_split sans succès, puis ensuite avec preg_match mais idem.

    Auriez vous une piste a me donner svp?

    Merci par avance
    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    comment sont définies les positions du nom de famille et des prénoms ?
    par exemple, est ce que le nom de famille est à chaque fois le mot après "Mme" ?

  3. #3
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Merci de vous penchez sur mon problème et oui la chaine de caractères et toujours structurée de la même façon sauf le nombre d'enfant qui varie.

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    au lieu d'utiliser des expressions régulières, vous pouvez séparer suivant les espaces comme cela :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?php
    $texte = "Mr et Mme Allan sont les parents de Théo.";
    //$texte = "Mr et Mme Dupont sont les parents de pierre, paul et jack.";
     
     
    // préparation : retrait des "," et "."
    $texte = str_replace([",", "."], "", $texte);
     
    // préparation : découpage suivant les espace
    $tabMots = explode(" ", $texte);
     
     
    // nom de famille : recherche de "Mme"
    $positionMme = array_search("Mme", $tabMots);
     
    // nom de famille : affichage
    echo "<p>";
    echo "Nom de famille : " . $tabMots[$positionMme + 1];
    echo "</p>";
     
     
    // liste des enfants : recherche de "de"
    $positionDe = array_search("de", $tabMots);
     
    // liste des enfants : extraction de la liste
    $tabEnfants = array_slice($tabMots, $positionDe + 1);
     
    // liste des enfants : retrait de "de" qui est l'avant-dernier élément de la liste
    if (2 < count($tabEnfants)) {
        array_splice($tabEnfants, -2, 1);
    }
     
    // liste des enfants : affichage
     
    ?>
     
    Enfants : 
    <ul>
     
        <?php foreach ($tabEnfants as $enfant) {?>
            <li>
                <?php echo htmlspecialchars($enfant);?>
            </li>
        <?php }?>
     
    </ul>

  5. #5
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjour Mathieu,

    merci pour votre réponse, j'y avais pensé et même à la possibilité de remplacer 'Mr et Mme ' et le '.' final par '' puis ' sont les parents de ' par '###', ensuite il resté juste à faire un preg_split sur '###' et un explode sur les enfants.

    Mais je voulais savoir si une solution plus générique était envisageable dans le cas ou le pattern de la phrase évolue.

    Encore merci
    Cordialement
    Shishi

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1/ pour info, en français, l'abréviation de Monsieur est M.
    Mr, c'est en anglais (Mister).

    2/ @mathieu
    Il existe des noms de famille composés de plusieurs mots, et/ou contenant "de" (noblesse française, par exemple).

    3/ une solution :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $chaine = 'Mr et Mme Dupont de la Joie sont les parents de pierre-henri, paul et jack.';
     
    $chaine2 = str_replace( array('Mr et Mme ',' sont les parents de ',', ',' et ','.'), array('','###',' ',' ',''), $chaine);
    $chaine2 = explode( '###', $chaine2);
     
    $parents = $chaine2[0]; // (chaine)
    $enfants = explode( ' ', $chaine2[1]); // (array)
     
    	echo 'Les parents sont : '.$parents.'<br />';
    	echo 'Les enfants sont : <ul><li>'.implode( '</li><li>', $enfants).'</li></ul><br />';
    Parents : Dupont de la Joie
    Enfants :
    - pierre-henri
    - paul
    - jack
    4/ une autre :
    Code php : 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
    <?php
    $chaine = 'Mr et Mme Dupont de la Joie sont les parents de pierre-henri, paul et jack.';
     
    $pattern = '^M[r.] et Mme (.*) sont les parents de (.*)\.^Ui';
    $result = preg_match( $pattern, $chaine, $matches );
    //print_r($matches);
     
    if($result)
    {
    	$parents = $matches[1]; // (chaine)
    	$enfants = explode( ' ', str_replace( array(', ',' et '), array(' ',' '), $matches[2] ) ); // (array)
     
    	echo 'Les parents sont : '.$parents.'<br />';
    	echo 'Les enfants sont : <ul><li>'.implode( '</li><li>', $enfants).'</li></ul><br />';
     
    }
    Dernière modification par Invité ; 18/04/2017 à 10h37.

  7. #7
    Membre à l'essai Avatar de shishi666
    Inscrit en
    Avril 2013
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 19
    Points : 10
    Points
    10
    Par défaut
    Bonjour jreaux,

    merci pour ta correction concernant la langue Française.

    Merci également pour ta solution N°2 (Le point 4 de ta réponse) qui me convient parfaitement.

    Et je suis toujours preneur de bon tuto concernant les regex si vous en avez.

    Bonne journée
    Shishi

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

Discussions similaires

  1. [XL-2007] extraire une partie d'une chaîne de caractère vers une text box
    Par affre dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/01/2016, 18h05
  2. extraire une partie d'une chaîne de caractère
    Par kernkraft dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/12/2010, 22h25
  3. [XL-2003] extraire une partie d'une chaîne de caractère
    Par fllyann dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/12/2010, 11h58
  4. Réponses: 21
    Dernier message: 28/01/2008, 20h56
  5. Supprimer une partie d'une chaîne de caractères
    Par pregup dans le forum Langage
    Réponses: 7
    Dernier message: 27/10/2007, 22h11

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