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 mot entre guillemets


Sujet :

Langage PHP

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 89
    Points : 51
    Points
    51
    Par défaut Extraire mot entre guillemets
    Bonjour à tous,
    Je bute depuis quelques jours pour arriver à mes fins.
    Mon objectif : extraire un mot particulier (ici le mot "champ") entouré par des guillemets et répondant à certains critères qui sont :
    - le mot peut être précédé d'un point, d'un espace ou rien
    - le mot peut être suivi du signe =, d'un espace ou rien

    Pour le moment, j'ai construit ce motif qui répond partiellement à mes attentes
    Motif : (?<=").*?[\s|\.]?(champ)[\s|\=].*?(?=")

    Pour illustrer, voici quelques tests (en gras, les mots matchés) :
    Exemple 1 : "where a.champ = b.champ" ==> OK mais seul le 1er mot "champ" est matché; je voudrais également le 2ème
    Exemple 2 : "table_champ_L" ==> OK
    Exemple 3 : $champ="blabla" ==> OK
    Exemple 4 : "champ = b.champ" ==> OK mais seul le 1er mot "champ" est matché; je voudrais également le 2ème
    Exemple 5 : champ:="5" ==> OK
    Exemple 6 : " champ = " + champ_L ==> OK
    Exemple 7 : "champ = " + champ_L ==> OK
    Exemple 8 : "champ= " + champ_L ==> OK
    Exemple 9 : "champ" + champ_L ==> KO je voudrais que le 1er mot champ soit également matché

    Avez-vous une idée ?

    Merci
    Cordialement,
    Maxime

  2. #2
    Inactif  
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2014
    Messages : 374
    Points : 479
    Points
    479
    Par défaut
    Bonjour.
    - le mot peut être précédé d'un point, d'un espace ou rien
    - le mot peut être suivi du signe =, d'un espace ou rien
    - champ "précédé de rien" ne veut rien dire !... ou alors le caractère "c" est le 1er de la chaine... Idem pour champ "suivi de rien" qui voudrait dire que "p" est le dernier caractère de la chaine.....

    - Quand vous dîtes précédé d'un espace : Est-ce un ou plusieurs espaces ?...

    - Quand vous dîtes précédé d'un point: Est-ce immédiatement précédé d'un point (cad tout collé), ou peut-il y avoir un ou plusieurs espaces ?...

    - Quand vous dîtes suivi d'un "=" : Est-ce immediatement suivi, ou peut-il y avoir 1 ou plusieurs espaces ?...

    - enfin, les guillemets, font-ils partie du motif ?... Apparemment oui, mais où doivent-ils se placer ?... Au début et à la fin de l'expression, ou alors n'importe où comme dans vos exemples ?...

    Bref je n'ai pas compris les règles de syntaxe à vérifier.
    Par ailleurs que voulez vous faire exactement avec cette chaine de caractère quand elle sera validée ?


    PS : champ précédé de "$" ou "_" est correct, de même quand il est suivi de "_" ou de ":" or ces caractères ne sont pas dans votre regex ???...

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 89
    Points : 51
    Points
    51
    Par défaut
    Bonjour iakou,

    Merci de prendre le temps de vous pencher sur mon problème pour lequel, je l'avoue les règles ne sont pas bien définies.
    L'objectif final consiste à faire une analyse d'impact sur un champ d'une table en base de données utilisé dans des requêtes SQL au niveau du code source de mon application.
    Comme vous avez pu vous en apercevoir, toutes les requêtes SQL (du moins le langage SQL à proprement parlé) du source sont comprises entre guillemets. C'est une règle générale.
    Ensuite, se présente plusieurs cas de figure :
    - on peut utiliser ou non des alias SQL, ce qui explique la présence éventuelle d'un "." devant mon champ
    - une requête SQL peut être construire par concaténation (Langage SQL entre guillemets + Variable) ==> Exemple : " where a.champ = " + $champ_L

    - champ "précédé de rien" ne veut rien dire !... ou alors le caractère "c" est le 1er de la chaine... Idem pour champ "suivi de rien" qui voudrait dire que "p" est le dernier caractère de la chaine.....
    Effectivement, dans tous les cas, le caractère "c" sera le 1er de la chaine et le "p" sera le dernier

    - Quand vous dîtes précédé d'un espace : Est-ce un ou plusieurs espaces ?...
    Il peut y avoir un ou plusieurs espaces

    - Quand vous dîtes précédé d'un point: Est-ce immédiatement précédé d'un point (cad tout collé), ou peut-il y avoir un ou plusieurs espaces ?...
    Oui, le champ doit être immédiatement précédé d'un point

    - enfin, les guillemets, font-ils partie du motif ?... Apparemment oui, mais où doivent-ils se placer ?... Au début et à la fin de l'expression, ou alors n'importe où comme dans vos exemples ?...
    Les guillemets font partie du motif et peuvent être situés n'importe où dans l'expression

    Exemple 2 : "table_champ_L" ==> OK
    Ne tenez pas compte de cet exemple. J'essaierai de le traiter plus tard après avoir compris la logique du motif

    Voilà j'espère avoir été plus clair, tout du moins plus qu'après mon 1er message je l'espère.
    Merci encore
    Cordialement,
    Maxime

  4. #4
    Inactif  
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2014
    Messages : 374
    Points : 479
    Points
    479
    Par défaut
    Bonjour.

    Vos précisions placent maintenant mieux le curseur dans l'échelle des difficultés.

    - Il me semble que vous n'allez pas vous en sortir uniquement avec des regex, car ce que vous voulez faire c'est de l'analyse syntaxique (le travail d'un interpréteur en qqsorte).
    - C'est assez complexe, il faut développer un algorithme de verification de la chaine, ce dernier utilisant accessoirement des regex.
    - Qui plus est, SQL étant relativement souple au niveau de la syntaxe, va entrainer inévitablement des complications de l'algorithme. Plus la syntaxe est rigide, plus l'algo est simple. Et inversement, plus la syntaxe est souple plus l'algo se complique...

    Mes compétences en la matière sont hélas, très limitées....

    Bon courage pour la suite, si vous devez persévérer.

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 89
    Points : 51
    Points
    51
    Par défaut
    Merci pour ce complément d'information.
    J'ai bien conscient que les possibilités sont larges en SQL et que le motif est par conséquent assez complexes.
    Je me rabattrai donc sur une solution plus algorithmique comme vous l'évoquez dans le message.

    Cependant, et plus pour ma culture personnelle, j'aimerais pouvoir répondre au moins à ce besoin :
    Soit l'exemple 1 de mon message : "where a.champ = b.champ"
    Objectif : extraire les mots "champ" qui se trouvent entre guillemets.
    Ce motif (?<=").*(\bchamp\b).*(?=") ne me ramène que le dernier mot "champ"
    Ce motif (?<=").*?(\bchamp\b).*(?=") ne me ramène que le premier mot "champ"
    J'essaie de manipuler le motif dans tous les sens pour ramener les 2 occurrences mais en vain.

    Une idée ?

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    S'agit-il de code PHP contenant des chaînes de caractères entre guillemets, elles-mêmes contenant du code SQL?

    Si oui, autant en passer d'abord par le tokenizer pour extraire toutes les chaînes de caractères dans un premier temps, puis rechercher les champs pour chacune d'elles dans un deuxième.

    Mais si ce n'est pas le cas, ce pattern devrait faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $pattern = '~(?:(?!\A)\G|")(?:(?!\bchamp\b)[^"])*(?:\K\bchamp\b|"[^"]*(*SKIP)(*FAIL))~';
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [RegEx] trouver mot entre guillemet
    Par markham dans le forum Langage
    Réponses: 10
    Dernier message: 03/03/2015, 12h21
  2. Mettre mot entre guillemets en AWK ?
    Par Moostiq dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 18/10/2011, 16h16
  3. [RegEx] Trouver les mots entre guillemets
    Par naynay dans le forum Langage
    Réponses: 6
    Dernier message: 20/07/2009, 16h43
  4. Extraire une chaine entre guillemets
    Par grenouille2008 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 01/07/2008, 16h40
  5. [debutant] extraire phrase entre balises
    Par debdev dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 13/06/2005, 13h00

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