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 :

regex facile mais je trouve pas ! [RegEx]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut regex facile mais je trouve pas !
    j'ai :
    pasmot : mot1 Et mot2 + mot3, mot4 & mot5

    et j'aimerais avec une seule regex splitter les mots (et + , &) pour avoir un array (avec mot 1 à 5 en enlevant si possible de la liste le pasmot devant les : ).
    j'y suis presque parvenu avec [^et\+\,\&] mais avec ce type d'expression il me prend "e" et "t" dans tous les mots ! et en ajoutant /s autour de "et" ça change rien...

    Merci

  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
    Bonjour

    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $a = ' pasmot : mot1 Et mot2 + mot3, mot4 & mot5';
    $pattern = '/:\s*|\s*(et)\s*|\s*\+\s*|\s*,\s*|\s*&\s*/i';
    $b = preg_split($pattern, $a);
    array_shift($b);
    print_r($b);
    ?>
    ou comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $a = ' pasmot : mot1 Et mot2 + mot3, mot4 & mot5';
    $pattern = '/:|et|\+|,|&/i';
    $c = array_map('trim', preg_split($pattern, $a));
    array_shift($c);
    print_r($c);
    ?>

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Bonjour

    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $a = ' pasmot : mot1 Et mot2 + mot3, mot4 & mot5';
    $pattern = '/:\s*|\s*(et)\s*|\s*\+\s*|\s*,\s*|\s*&\s*/i';
    $b = preg_split($pattern, $a);
    array_shift($b);
    print_r($b);
    ?>
    ou comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $a = ' pasmot : mot1 Et mot2 + mot3, mot4 & mot5';
    $pattern = '/:|et|\+|,|&/i';
    $c = array_map('trim', preg_split($pattern, $a));
    array_shift($c);
    print_r($c);
    ?>
    Ah ben magnifique
    alors il suffisait de mettre "et" entre parenthèse et \s* espace autour. je comprend pas pourquoi j'avais dans l'idée de tout entourer de crochets (ou parenthèses)
    array_shift() extrait la première valeur d'un tableau et la retourne, en raccourcissant le tableau d'un élément, et en déplaçant tous les éléments vers le bas. Toutes les clés numériques seront modifiées pour commencer à zéro.
    donc si je n'ai pas le premier "pasmot : " je met pas array_shift ?

    Merci beaucoup

  4. #4
    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
    Citation Envoyé par flashub Voir le message
    donc si je n'ai pas le premier "pasmot : " je met pas array_shift ?
    Oui et tu peux aussi retirer le : du regex

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Oui et tu peux aussi retirer le : du regex
    et si j'ai les deux cas de figure :
    $a = ' pasmot : mot1 Et mot2 + mot3, mot4 & mot5';
    et
    $abis = 'mot1 Et mot2 + mot3, mot4 & mot5';

    il faut un if ou il y a moyen avec un seul regex ?

  6. #6
    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
    Pour les deux cas de figures, il faut nettoyer un peu la chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $a = ' pasmot  :     mot1 Et mot2 + mot3, mot4 & mot5';
    //$a = 'mot1 Et mot2 + mot3, mot4 & mot5';
    $a = (($pos = strpos($a, ':')) === false) ? $a : trim(substr($a, $pos+1));
    $pattern = '/\s*(et)\s*|\s*\+\s*|\s*,\s*|\s*&\s*/i';
    $b = preg_split($pattern, $a);
    print_r($b);
    ?>
    ça résout les deux cas de figures sans s'embarquer dans un regex illisible.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Pour les deux cas de figures, il faut nettoyer un peu la chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $a = ' pasmot  :     mot1 Et mot2 + mot3, mot4 & mot5';
    //$a = 'mot1 Et mot2 + mot3, mot4 & mot5';
    $a = (($pos = strpos($a, ':')) === false) ? $a : trim(substr($a, $pos+1));
    $pattern = '/\s*(et)\s*|\s*\+\s*|\s*,\s*|\s*&\s*/i';
    $b = preg_split($pattern, $a);
    print_r($b);
    ?>
    ça résout les deux cas de figures sans s'embarquer dans un regex illisible.
    oui parfait comme ça.
    Merci énormément

  8. #8
    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
    Penses au tag

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par rawsrc Voir le message
    Pour les deux cas de figures, il faut nettoyer un peu la chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $a = ' pasmot  :     mot1 Et mot2 + mot3, mot4 & mot5';
    //$a = 'mot1 Et mot2 + mot3, mot4 & mot5';
    $a = (($pos = strpos($a, ':')) === false) ? $a : trim(substr($a, $pos+1));
    $pattern = '/\s*(et)\s*|\s*\+\s*|\s*,\s*|\s*&\s*/i';
    $b = preg_split($pattern, $a);
    print_r($b);
    ?>
    ça résout les deux cas de figures sans s'embarquer dans un regex illisible.
    zut j'avais pas bien testé, j'ai mis résolu un peu vite, j'ai tout de même un problème avec 'et' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $a = ' pasmot  :     moet1 Et mot2 + mot3, mot4 & mot5';
    $a = (($pos = strpos($a, ':')) === false) ? $a : trim(substr($a, $pos+1));
    $pattern = '/\s*(et)\s*|\s*\+\s*|\s*,\s*|\s*&\s*/i';
    $b = preg_split($pattern, $a);
    print_r($b);
    ?>
    résultat :
    Array
    (
    [0] => mo
    [1] => 1
    [2] => mot2
    [3] => mot3
    [4] => mot4
    [5] => mot5
    )

    les \s* ne font pas bien leur boulot ? il signifie un espace de chaque coté non ?

    il semble que $pattern = '/\s* (et) \s*|\s*\+\s*|\s*,\s*|\s*&\s*/i'; marche mieux mais est-ce une bonne solution ?

  10. #10
    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
    Si si les \s font très bien leur boulot en regex * <=> {0,}Pour ne pas récupérer les 'et' contenu dans les mots, il suffit de dire que le 'et' soit entouré d'au moins un espace de part et d'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $a = ' pasmot  :     moet1 Et mot2 + mot3, mot4 & mot5';
    $a = (($pos = strpos($a, ':')) === false) ? $a : trim(substr($a, $pos+1));
    $pattern = '/\s+(et)\s+|\s*\+\s*|\s*,\s*|\s*&\s*/i';
    $b = preg_split($pattern, $a);
    print_r($b);
    ?>
    NB : ta solution est bonne aussi mais je préfère identifier un espace par \s que par un espace vide.

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

Discussions similaires

  1. L'autocomplétion marche mais ne trouve pas de contenu
    Par manudwarf dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/05/2009, 13h04
  2. PopUp marche sans GET mais ne trouve pas la page avec GET
    Par Orbiplanax dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 20/12/2008, 13h01
  3. Réponses: 2
    Dernier message: 12/09/2007, 21h47
  4. With // Je cherche mais ne trouve pas
    Par cm16 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/05/2007, 20h44
  5. Réponses: 8
    Dernier message: 03/10/2006, 17h34

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