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 :

Est-il possible de faire ça avec une regex ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 58
    Par défaut Est-il possible de faire ça avec une regex ?
    Salut à tous,

    Je cherche à récupérer les chaines de caractères qui contiennent 2 espaces.

    J'y arrive à moitié avec ce code :

    pour la chaine par exemple : "il y a beaucoup de chien sur le plage"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/[a-z]+[ ][a-z]+ /',$texte, $array2);
    Ça donne :

    0 => string 'il y ' (length=5)
    1 => string 'a beaucoup ' (length=11)
    2 => string 'de chien ' (length=9)
    3 => string 'sur la ' (length=7)

    Mais je voudrais que ça me donne également :

    'y a '
    'beaucoup de '
    'chien sur '

    Est ce que c'est possible ?

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Le problème est que l'on ne peut pas consommer deux fois le même caractère et donc on ne peut pas obtenir des correspondances qui se chevauchent. Par contre on peut utiliser une petite ruse qui consiste à ne rien matcher du tout en plaçant toute la pattern dans un test avant (lookahead).

    En effet un test avant est comme son nom l'indique juste un test et ne consomme pas de caractères, on parle de zero-width assertion au même titre qu'un test arrière, qu'une ancre ou qu'un word boundary. Il va donc pouvoir librement essayer toutes les positions de la chaîne.

    Ce faisant, les résultats seront toujours une chaîne vide, car encore une fois un lookahead ne consomme pas de caractères. Pour récupérer ce qui est vu dans ce lookahead, il suffit de placer son contenu dans un groupe de capture:Maintenant, pour éviter que la pattern ne réussisse au milieu d'un mot et ne test des positions inutiles, on peut la faire précéder d'un word boundary:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /\b(?=([a-z]+ [a-z]+ ))/
    ou plus rigoureusement d'un test arrière négatif vérifiant qu'il n'y a pas de lettres avant la position courante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /(?<![a-z])(?=([a-z]+ [a-z]+ ))/
    NB: on peut assez facilement faire la même chose pour cet exemple précis sans utiliser preg_match_all:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $str = 'il y a beaucoup de chiens sur la plage';
     
    $wds = explode(' ', $str);
     
    $res = $wds;
     
    array_pop($res);
    array_shift($wds);
     
    foreach ($wds as $k=>$v)
        $res[$k] .= ' ' . $v;
     
    print_r($res);

Discussions similaires

  1. Est-il possible d'utiliser nhibernate avec une base en 1FN
    Par pschiit dans le forum NHibernate
    Réponses: 1
    Dernier message: 10/04/2015, 16h31
  2. est-il possible de faire un where avec une liste en paramètre
    Par amednagh dans le forum Développement
    Réponses: 7
    Dernier message: 19/10/2011, 18h45
  3. Réponses: 2
    Dernier message: 28/09/2010, 19h00
  4. Réponses: 7
    Dernier message: 09/05/2006, 11h30
  5. Est il possible de faire une fusion
    Par boy569 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 07/02/2006, 13h58

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