j’essaie de faire un regexp qui me récupère dans une requete SQL quelconque, la liste des tables affectées dans la requête. Ce qui doit tenir compte des JOIN, des FROM table1,table2 etc…
Alors je suis bloqué a ca:
/.from ((\w)+[,\s]+).*/i (qui ne tiens pas compte pour le moment des join). Et ca ne marche pas bien du tout.
Je n’y connais rien en expression régulière mais tu peux essayer de dire que la clause FROM se termine dans le cas où il y a WHERE et/ou GROUP BY et/ou ORDER BY sinon allez jusqu’à la fin. Est-ce que tu peux faire des | successifs ?
[quote name=‘phili_b’ date=’ 25 Jan 2005, 16:46’]Je n’y connais rien en expression régulière mais tu peux essayer de dire que la clause FROM se termine dans le cas où il y a WHERE et/ou GROUP BY et/ou ORDER BY sinon allez jusqu’à la fin. Est-ce que tu peux faire des | successifs ?
[right][post=“325604”]<{POST_SNAPBACK}>[/post][/right][/quote]
Sauf s’il veut aussi les tables concernées dans les sous-requêtes (genre select truc from machin where chose = (select count(*) from bidule where id<100)) par exemple
[quote name=’[PERE]Cil’ date=’ 26 Jan 2005, 14:59’]Oh merci ca m’aide déjà pas mal… et pour les commande JOIN? Pas d’idée par hasard?
[right][post=“325937”]<{POST_SNAPBACK}>[/post][/right][/quote]
Tu as un exemple de JOIN ? Car là je ne vois pas ce qui te pose problème.
[quote name=’[PERE]Cil’ date=’ 27 Jan 2005, 11:01’]/me, trop content d’avoir trouvé quelqu’un qui touche en regexp
[right][post=« 326195 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Bah, tu as surtout de la chance que sur mon projet actuel on carbure à la regexp (On pousse sed dans ses derniers retranchements).
/me, trop content de faire profiter de mes prises de têtes sur le sujet.
[quote name=’[PERE]Cil’ date=’ 28 Jan 2005, 16:52’]/(from|join)\s+?(\w+)?(\s*,\s*?(\w+)?)*/i
Seulement voila la requete:
SELECT * FROM batch ,engine , query WHERE batch.id<‹ 10 ›
me zappe la table engine.
[right][post=« 326764 »]<{POST_SNAPBACK}>[/post][/right][/quote]
Je viens de découvrir le problème dans la doc. Seul le dernier match est récupéré dans le cas d’une expression qui se répète.
Du coup je ne vois qu’une solution, pas élégante du tout, rajouter autant de bloc b?[/b] que tu prévois d’avoir de tables à la suite.
Ce qui donne pour ton exemple:
/(from|join)\s+?(\w+)?(\s*,\s*?(\w+)?)?(\s*,\s*?(\w+)?)?/i
Je n’ai pas le temps de chercher plus pour l’instant (because départ vacances).
[quote name=’[PERE]Cil’ date=’ 1 Feb 2005, 15:30’]Cette requete ne marche pas tres tres bien:
SELECT * FROM table1,table2 , table3 LEFT JOIN table4 ON table4.code = table2.code WHERE table1.id<‘10’ LIMIT 10
[right][post=“327861”]<{POST_SNAPBACK}>[/post][/right][/quote]
Fini les vacances ! Retour au taf…
J’ai trouvé une solution qui est indépendante du nombre de tables :
/(?:from|join)\s*(?\w+?(?:\s*,\s*?\w+?)*)/i
Cette regexp te permet de récupérer des chaînes contenant un ou plusieur noms de table séparés par des virgules.
Avec ton exemple ça donne (je l’ai testé):
chaîne 1 = "table1,table2 , table3"
chaîne 2 = “table4”
Ensuite utilisation de split() sur chaque chaîne pour avoir les noms des tables.