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 :

Capturer une chaîne en dehors de parenthèses


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut Capturer une chaîne en dehors de parenthèses
    Bonjour,

    je recherche le moyen de capturer un morceau de chaine qui ne soit pas entre '' ou entre ()

    par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM table WHERE ID IN (SELECT * FROM Table)
    ici je veux capturer le FROM qui n'est pas entre ()
    doc je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $query = "SELECT * FROM table WHERE ID IN (SELECT * FROM Table)";
    preg_match("/LIMIT(.*)/msi", $query, $match);

    Merci de votre aide

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Salut,

    Peut-être avec preg_split

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $r = preg_split('#\(.*\)#msi', $query, -1, PREG_SPLIT_NO_EMPTY);
    print_r($r);

  3. #3
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Merci pour ta réponse,
    en fait je doit capturer le texte premier SELECT jusqu'au FROM sans parenthèses mais en gardant le contenu entre parenthèse

    par exemple:

    le regex doit me retourner *

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $sql= 'SELECT * FROM table WHERE ID IN (SELECT * FROM Table)';
    Merci

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Dans ce cas, oui alors, preg_match est suffisant.

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $sql= 'SELECT champ1, champ2, champ3 FROM table WHERE ID IN (SELECT * FROM Table)';
    preg_match('#SELECT (.+) FROM .+#Usi', $sql, $match);
    echo $match[1];

    Il ne te retournera que la 1ère occurence trouvée, et comme le 1er SELECT n'est jamais entre parenthèse, un masque simple est suffisant.

  5. #5
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    merci de la réponse mais il y a une autre fom de string

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $sql= 'SELECT * FROM table WHERE ID IN (SELECT * FROM Table)';
     
    ou bien 
     
    $sql= 'SELECT 
    *, 
    (select * from matable) AS test 
    FROM table WHERE ID IN (SELECT * FROM Table)';
    le select et le form ne doivent pas être entre parenthèses en fait

    Merci de ton aide

  6. #6
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    J'arrive pas à comprendre ton histoire de parenthèses de from etc. En gros tu veux capturer quoi ? La liste des colonnes de ta requete ? Les noms des colonnes (alias plutot que (select ...)) ?

  7. #7
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    En gros, je veux capturer tout ce qui se trouve entre SELECT et FROM, dont ni le SELECT ni le FROM ne soient pas entre parenthèse, ni entre quotes

    Merci de ton aide

  8. #8
    Membre éclairé Avatar de Korko Fain
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    632
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 632
    Points : 718
    Points
    718
    Par défaut
    Et dans ce cas là, il te retourne quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql= 'SELECT 
    *, 
    (select * from matable) AS test 
    FROM table WHERE ID IN (SELECT * FROM Table)';

  9. #9
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Merci de votre aide

    cela me retourne

    Array
    (
    [0] => SELECT
    *,
    (select * from m
    [1] =>
    *,
    (select *
    )


  10. #10
    Membre régulier
    Profil pro
    CEO
    Inscrit en
    Avril 2002
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : CEO

    Informations forums :
    Inscription : Avril 2002
    Messages : 84
    Points : 74
    Points
    74
    Par défaut
    Je pense avoir trouver une solution, je vais faire un remplacement des mots entre quotes ou parenthèses afin de palier au problème

    euh, quelqu'un saurait comment remplacer un mot entre parenthèse
    par exemple

    $sql= "SELECT
    *,
    (SELECT * FROM matable WHERE 1=1) AS test
    FROM
    table
    WHERE
    ID IN (SELECT * FROM Table WHERE 1=1) AND
    a LIKE '%WHERE 1=1%'
    GROUP BY
    test
    ORDER BY
    tests";
    je veux remplacer les mots FROM entre parentèses ou guillemets par [:FRXM:]



    Merci

  11. #11
    Membre habitué Avatar de daniel61
    Inscrit en
    Décembre 2006
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 139
    Points : 169
    Points
    169
    Par défaut
    j'imagine que tu veux pouvoir chercher n'importe quoi comme de WHERE à GROUP BY. à mon avis, le méta-caractère le plus puissant est | car il offre la possibilité de mettre des patterns entier en concurrence entre eux. dans ce cas-ci, il faut passer par dessus tout ce qui est entre parenthèses et entre quote SQL qui sont '` si ma mémoire est bonne. et tout le reste est bon... donc on peut opposer ces 3 patterns.

    en utilisant l'option U (ungreedy) sur toute l'expression, alors on peut dire que le contenu entre parenthèses est détecté par le pattern \(.+\) et dans la même logique que le contenu entre quote SQL '` est détecté par le pattern ['`].+['`] avec une nuance... et que le troisième pattern est tout simplement le point.

    faire un masque de ces 3 patterns et capturer en \\1 dès le début pour éliminer par exemple le WHERE qui serait entre parenthèses ou quote avant le WHERE voulu. ensuite une simple référence à ce masque pour reproduire ces patterns en | comme une sous routine entre par exemple le WHERE et le GROUP BY.

    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
     
    $sql= "SELECT
    *,
    (SELECT * FROM matable WHERE 1=1) AS test
    FROM
    table
    WHERE
    ID IN (SELECT * FROM Table WHERE 1=1) AND
    a LIKE '%GROUP BY%'
    GROUP BY
    test
    ORDER BY
    tests";
     
    $debut='WHERE';
    $fin='GROUP BY';
     
    if(preg_match('#(\(.+\)|([`\']).+\2|.)*'.$debut.'\s+((?1)+)\s+'.$fin.'#Usi',$sql,$match)) {
      echo $match[3];
    }
    tu peux énumérer les quotes SQL dans ([`\']) si ma mémoire est défectueuse. et si ma suggestion ci-haut ne te plait pas, tu peux aussi regarder du coté des masques conditionnels.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. [MySQL] Affichage d’une chaîne de caractères contenant des parenthèses
    Par mathiotp dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 20/11/2007, 20h31
  3. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  4. Comptage de mots dans une chaîne
    Par kikinou dans le forum Pascal
    Réponses: 10
    Dernier message: 01/01/2003, 02h27
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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