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 preg_match_all() [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 144
    Points : 151
    Points
    151
    Par défaut Regex preg_match_all()
    Bonsoir, mon problème est le suivant :

    J'ai une chaine de cette forme la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $chaineDepart = "'xxxxx', 'yyyyyyy\'yyyyyyy', 'zzzzzzz'";
    Je voudrais pouvoir récupérer tous se qui est contenu entre les simples côtes. Ce qui signifie que le chaine que tout se qui est souligner doit etre récupérer meme le \' mais je n'arrive pas a l'echapper :

    "'xxxxx', 'yyyyyyy\'yyyyyyy', 'zzzzzzz'";

    Voici mon regex de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("#'[^(\')*]'#", $chaineDepart, $matches);
    Merci d'avance

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    si ta chaîne est réellement toujours du même type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $rows = explode(", ", $str);
    for($i = 0, $size = count($rows); $i < $size; $i++) {
    $rows[$i] = substr($rows[$i], 1, strlen($rows[$i]) - 1);
    }
    bye

  3. #3
    Membre habitué
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 144
    Points : 151
    Points
    151
    Par défaut
    nn dsl ce n'est pas possible car a la place des xxxxxx yyyyy ou zzzzz c'est une chaine quelconque (qui peut donc contenir des ,).
    Je ne peut faire sa qu'avec une expression mais je n'arrive pas a echapper \'. Il me mank juste cela.

    Mais merci kan meme

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Je crois que ce pattern fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all("#('.*[^\\\]')#U", $chaineDepart, $matches);
    Bye

  5. #5
    Membre habitué
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 144
    Points : 151
    Points
    151
    Par défaut
    Merci ça fonctionne, merci beaucoup j'en voyais pas le bout. Par contre pourrait tu me fournir des explications, je ne comprend pas pourquoi sa marche et quelle était mon erreur.

    Merci d'avance

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    En fait, tu peux pas mettre de parenthèses capturantes dans une classe de caractères donc en faisant [^(\')] tu dis de matcher tous les caractères sauf les caractères (\')*

    Avec ce pattern #('.*[^\\\]')#U tu dis de matcher quote + n'importe quel caractère 0 à n fois + dernier caractère différent de \ + quote. Il faut que t'échappes le \ ça donne \\.
    Par contre je ne sais pas pourquoi on doit en mettre 3 ? J'imagine que sinon il échappe le dernier ]
    Et le modificateur 'U' permet de rendre l'expression non greedy, et de matcher le minimum de caractères possibles sinon il va matcher ta chaîne en entier.

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

Discussions similaires

  1. [RegEx] Utiliser 2 regex dans 1 preg_match_all
    Par ongis dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2013, 14h03
  2. [RegEx] regex preg_match_all expression
    Par mapmip dans le forum Langage
    Réponses: 2
    Dernier message: 09/07/2012, 10h04
  3. [RegEx] Aide preg_match_all regex
    Par Six3l/\D dans le forum Langage
    Réponses: 2
    Dernier message: 10/01/2011, 17h26
  4. Aide preg_match_all regex
    Par Six3l/\D dans le forum Langage
    Réponses: 3
    Dernier message: 07/01/2011, 17h23
  5. [RegEx] [regex][preg_match_all]ma regex marche pas
    Par hansaplast dans le forum Langage
    Réponses: 15
    Dernier message: 05/09/2006, 14h59

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