Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/01/2008, 12h37   #1
Futur Membre du Club
 
Grégory PLANCHAT
Inscription : juin 2005
Messages : 38
Détails du profil
Informations personnelles :
Nom : Grégory PLANCHAT
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : juin 2005
Messages : 38
Points : 17
Points : 17
Par défaut Analyse de requêtes SQL

Je cherche à analyser des requêtes SQL pour les interpréter, j'utilise pour ca PCRE dans PHP. Je pense être proche de ce que je devrais avoir, mais je sèche un peu concernant les noms de champs :

J'utilise l'expression suivante :
Code :
((?<=\[)[^]]+|(?<=`)[^`]+|\w+)
Elle devrait capturer le noms de tables en tant que mot complet, ou bien nom contenant des espaces entre [ et ] ou entre ` et `

Seulement, dans les cas où j'utilise les [] et ``, je ne capture pas le caractère fermant (je ne veux pas le capturer), et ca me pose problème pour la suite, il faut que je l'exclue du sujet de recherche.
Grégory PLANCHAT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2008, 14h01   #2
Futur Membre du Club
 
Grégory PLANCHAT
Inscription : juin 2005
Messages : 38
Détails du profil
Informations personnelles :
Nom : Grégory PLANCHAT
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : juin 2005
Messages : 38
Points : 17
Points : 17
Je vais reformuler ma question :

Comment capturer un caractère (déplacer le pointeur) sans le retrouver dans les résultats.
Grégory PLANCHAT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 00h44   #3
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
De manière générale, on utilise un tableau de matches pour ne pas se poser ce genre de problème, et n'extraire que les parties souhaitées.

Par ailleurs, tu peux être raisonnablement sûr que les noms de table ne contiennent ni [ ni ] ni `, tu peux donc utiliser :
Code :
1
2
3
/(?:[[`])(.+?)(?:[`\]])/
ou bien 
/(?:[[`])([^`\]]+)(?:[`\]])/
et récupérer le $1.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2008, 22h27   #4
Futur Membre du Club
 
Grégory PLANCHAT
Inscription : juin 2005
Messages : 38
Détails du profil
Informations personnelles :
Nom : Grégory PLANCHAT
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : juin 2005
Messages : 38
Points : 17
Points : 17
Merci pour ta réponse

Citation:
Envoyé par Antoun Voir le message
Par ailleurs, tu peux être raisonnablement sûr que les noms de table ne contiennent ni [ ni ] ni `, tu peux donc utiliser :
Malheureusement, c'est pour lire dans des fichiers CSV et Excel, je ne peux pas en être "raisonnablement sûr"

Le problème que me pose cette solution, c'est que pour lire ces fichiers, je me sers de la première ligne comme noms de tables, et donc si je me retrouve avec une table nommée "champ[test]haha", et que je dois faire ma requête :

Code :
 SELECT `champ[test]haha` FROM ...
Le regex en déduira un champ "champ[test" et risquera de fonctionner d'une manière imprévue
Grégory PLANCHAT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 00h57   #5
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
OK, revenons donc à la séparation en deux cas :
Code :
/`([^`]+)`|\[([^\]]+)\]/
Pour chaque reconnaissance, soit $1 soit $2 contient ton nom de table.
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2008, 23h12   #6
Futur Membre du Club
 
Grégory PLANCHAT
Inscription : juin 2005
Messages : 38
Détails du profil
Informations personnelles :
Nom : Grégory PLANCHAT
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : juin 2005
Messages : 38
Points : 17
Points : 17
ok, merci pour les réponses
Grégory PLANCHAT est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h37.


 
 
 
 
Partenaires

Hébergement Web