Regexp pour extraire le nom des tables d'une chaîne.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Regexp pour extraire le nom des tables d'une chaîne.

Re: Regexp pour extraire le nom des tables d'une chaîne.

par Cyrano » 22 oct. 2010, 08:11

Pour information, il y a des outils pratiques en ligne pour mettre au point les regexp, par exemple celui-ci avec même un tuto très complet sur les PCRE.

Re: Regexp pour extraire le nom des tables d'une chaîne.

par hickscorp » 22 oct. 2010, 00:51

Personne aurait une solution? :D

Re: Regexp pour extraire le nom des tables d'une chaîne.

par stealth35 » 21 oct. 2010, 17:55

ducoup ca va pas, parce que même si c'est tordu je peux appelle un non de table : 'hé{h"""hé}(hé(()héé", et la il supprimera ce qui est entre les quote

Re: Regexp pour extraire le nom des tables d'une chaîne.

par stealth35 » 21 oct. 2010, 17:24

dixit la doc c'est
\w any character that \p{L} or \p{N} matches, plus underscore
any "word" character
en gros [a-zA-Z0-9_] et en mode utf-8 y'a tout les accents et compagnie


\p{L} tout ce qui est de la classe Letter
\p{N} tout ce qui est de la classe Number

si tu va sur : http://www.utf8-chartable.de/
en gros tout ce qui est LETTER : exemple :
U+00EE î c3 ae LATIN SMALL LETTER I WITH CIRCUMFLEX

Re: Regexp pour extraire le nom des tables d'une chaîne.

par hickscorp » 21 oct. 2010, 17:16

sauf que le prochain probleme c'est le nom des table et des colonne y'a plus de caratere que dans le \w
http://dev.mysql.com/doc/refman/5.0/fr/legal-names.html
Pas saisi, des noms de tables où y'a plus de caractères que dans le \w? Y'a combien de caractères dans le \w? :D

Re: Regexp pour extraire le nom des tables d'une chaîne.

par stealth35 » 21 oct. 2010, 17:14

\x60 ouais c'est l'accent grave
ca existe en PHP aussi c'est équivalant de shell_exec
echo `php -m`;
//===
echo shell_exec('php -m');

Re: Regexp pour extraire le nom des tables d'une chaîne.

par hickscorp » 21 oct. 2010, 16:59

et si tu supprime d'hab tout ce qui est entre guillemet ? comme ca
$r = "Table1.a IN (1) AND COUNT(Table2.b)>3 OR Table3.pupu=4839.32 AND Table4.haha LIKE 'hmm... Faux1.bah hmm.'";
$r = preg_replace('/([\'"])[^\1]+\1/', '', $r);
preg_match_all('/\x60?([A-Z]\w+)\x60?\./', $r, $m);
print_r($m);
Parfait dude :) Juste pour info, c'est quoi x60 comme caractère, le faux apostrophe SQL?

Re: Regexp pour extraire le nom des tables d'une chaîne.

par stealth35 » 21 oct. 2010, 16:56

je t'ai mis ca dans mon EDIT 2 :wink:
$r = "Table1.a IN (1) AND COUNT(Table2.b)>3 OR Table3.pupu=4839.32 AND Table4.haha LIKE 'hmm... Faux1.bah hmm.'";
$r = preg_replace('/([\'"])[^\1]+\1/', '', $r);
preg_match_all('/\x60?([A-Z]\w+)\x60?\./', $r, $m);
print_r($m);
sauf que le prochain probleme c'est le nom des table et des colonne y'a plus de caratere que dans le \w
http://dev.mysql.com/doc/refman/5.0/fr/legal-names.html

Re: Regexp pour extraire le nom des tables d'une chaîne.

par hickscorp » 21 oct. 2010, 16:49

donc il est obligé de mettre le nom des tables dans les where ?
Oui, dans le cas où il veut faire une spécification directe de la clause WHERE / HAVING (Autrement il y a dans le framework des objets Condition, Operand, Operator etc qui permettent de ne pas avoir à le faire "à la main", mais il existe tout de même cette possibilité des WHERE ou HAVING en "texte à la main").
EDIT : et si tu supprime d'hab tout ce qui est entre guillemet ?
Oui gérable... Genre:
1ere passe: Suppression des guillemets échappés dans la chaine.
2e passe: On loop sur chaque caractère de la chaine, quand on rencontre un guillemet on met un flag à 1, et ensuite dans cette même boucle tant que le flag est à 1 on supprime le prochain caractère, sauf si c'est un guillemet auquel cas on remet le flag à 0 et on continue.
3e passe: On fait le regexp.

Y'a pas moyen de le faire en une seule passe avec les regexp? C'était pour ça que dans mon premier message je demandais si quelqu'un avait la solution "toute faite", justement pour éviter d'en arriver à tout ça :D

Re: Regexp pour extraire le nom des tables d'une chaîne.

par stealth35 » 21 oct. 2010, 16:37

donc il est obligé de mettre le nom des tables dans les where ?

EDIT : et si tu supprime d'hab tout ce qui est entre guillemet ?

EDIT 2 : comme ca
$r = "Table1.a IN (1) AND COUNT(Table2.b)>3 OR Table3.pupu=4839.32 AND Table4.haha LIKE 'hmm... Faux1.bah hmm.'";
$r = preg_replace('/([\'"])[^\1]+\1/', '', $r);
preg_match_all('/\x60?([A-Z]\w+)\x60?\./', $r, $m);
print_r($m);

Re: Regexp pour extraire le nom des tables d'une chaîne.

par hickscorp » 21 oct. 2010, 16:30

faut voire aussi a quelle moment peux suivre un nom de table,
doit y 'avoir FROM, JOIN, INTO, HAVING, UPDATE, TABLE
si t'en vois d'autre ...
Uniquement WHERE et HAVING (Puisque les conditions sont fournies au framework par le developeur et uniquement les conditions).
Les FROM, JOIN, INTO, UPDATE... Sont générés par le framework en fonction des conditions.

Re: Regexp pour extraire le nom des tables d'une chaîne.

par stealth35 » 21 oct. 2010, 16:25

faut voire aussi a quelle moment peux suivre un nom de table,
doit y 'avoir FROM, JOIN, INTO, HAVING, UPDATE, TABLE
si t'en vois d'autre ...

Re: Regexp pour extraire le nom des tables d'une chaîne.

par hickscorp » 21 oct. 2010, 16:20

normalement les requêtes tu dois mettre un ` autour des champs,
"Je" met toujours un ` autours de mes champs. Les développeurs qui utilisent mon framework, non :)
pour le reste si tu regarde du coté de Doctrine tout l'ORM se base sur le DQL, il va juste chercher les champs dans la fonction "where"
Oui j'ai pas mal bossé avec... Mais dans le projet dont je parle certaines contraintes techniques n'étaient pas satisfaisantes avec Doctrine ou PhpActiveRecord...

Pour en revenir au shmilblick, je vais essayer de décortiquer le parser MySQL à la recherche de leur routine d'éclatement de conditions...

Dans tous les cas, je te remercie grandement pour ton aide très utile (Je vais choisir ta dernière réponse comme étant la bonne, histoire quand même que tu n'aies pas perdu ton temps =D)

Pierrot.

Re: Regexp pour extraire le nom des tables d'une chaîne.

par stealth35 » 21 oct. 2010, 16:14

normalement les requêtes tu dois mettre un ` autour des champs, pour le reste si tu regarde du coté de Doctrine tout l'ORM se base sur le DQL, il va juste chercher les champs dans la fonction "where"

Re: Regexp pour extraire le nom des tables d'une chaîne.

par hickscorp » 21 oct. 2010, 16:09

la ca deviens chaud, c'est pour faire quoi a la base ?
Ben je bosse sur une couche d'abstraction de base de donnée assez complexe. Avant de générer des requêtes, je souhaite parser les conditions WHERE / HAVING, afin que le constructeur de requête puisse déterminer quelles tables sont utilisées dans la requête, pour ensuite être en mesure de n'inclure que les jointures automatiques nécéssaires et pas toutes.

[EDIT]Je m'exprime très mal. En gros:
- Le constructeur de requête connaît toutes les relations entre tables,
- Il peut donc construire une requête à ralonge, qui syntaxiquement parlant sera juste et sans erreur, mais avec un overhead de malade pour le serveur SQL puisque certains objets peuvent avoir jusque 17 jointures...
- Je souhaite donc déterminer quelles jointures inclure (ou non) en fonction des conditions (Donc tables) présentes dans les clauses WHERE et HAVING :)

Est-ce que je suis réellement claîr? :D[/EDIT]