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

Eléphanteau du PHP | 12 Messages

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

ViPHP
ViPHP | 5462 Messages

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

Eléphanteau du PHP | 12 Messages

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?

ViPHP
ViPHP | 5462 Messages

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');

Eléphanteau du PHP | 12 Messages

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

ViPHP
ViPHP | 5462 Messages

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

ViPHP
ViPHP | 5462 Messages

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

Eléphanteau du PHP | 12 Messages

22 oct. 2010, 00:51

Personne aurait une solution? :D

Mammouth du PHP | 19672 Messages

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.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: