Je veux identifier deux types de requ�tes sql simples diff�rentes que je
peux recevoir, pour effectuer un traitement diff�rent avant d'envoyer la
requ�te au sgbd.
Dans les deux cas � tester, j'ai toujours "INCONNU" comme r�sultat.
J'ai bien utilis� i � la fin pour ne pas avoir de probl�mes pour les
majuscules et minuscules, et j'ai essay� avec et sans, meme probleme.
[\ ]{0,} sert pour ne pas rater une requete si elle contient un espace en
plus entre deux parties de la requete.
Ou est l'erreur ?
Merci de votre assistance !
voici le code
// Premiere chaine � savoir intercepter
//$SQLRequete ="SELECT CURRVAL('seq_montruc_id')";
// Deuxieme chaine a savoir intercepter
a.. $Chaine ="SELECT mavaleur FROM matable WHERE lechamp = 1234";
a..
a..
IF(preg_match('/^(SELECT){1}[\ ]{0,}(CURRVAL\(\'){1}([a-zA-Z]+)(\'\)){1}$/i'
, $Chaine)==1)
a.. {
a.. echo('CURRVAL');
a.. }
a.. elseif(preg_match('/^(SELECT){1} [\ ]{0,} ([a-z]){0,} (\.){0,1}
(FROM){0,1} [\ ]{0,} ([a-z]){0,} (WHERE){0,1}
[\ ]{0,}([a-z]){0,}[\ ]{0,}[=]{1}[\ ]{0,}([0-9]){0,}$/i', $Chaine)==1)
a.. {
a.. echo('SELECT FROM ');
a.. }
a.. else
a.. {
a.. echo('INCONNU');
a.. }
Pour les �crire, d�j�...
> Je veux identifier deux types de requ�tes sql simples diff�rentes que je
> peux recevoir, pour effectuer un traitement diff�rent avant d'envoyer la
> requ�te au sgbd.
> Dans les deux cas � tester, j'ai toujours "INCONNU" comme r�sultat.
>
> J'ai bien utilis� i � la fin pour ne pas avoir de probl�mes pour les
> majuscules et minuscules, et j'ai essay� avec et sans, meme probleme.
> [\ ]{0,} sert pour ne pas rater une requete si elle contient un espace en
> plus entre deux parties de la requete.
>
> Ou est l'erreur ?
Mauvaise lecture de la doc et complexification inutile.
> voici le code
>
> // Premiere chaine � savoir intercepter
> "SELECT CURRVAL('seq_montruc_id')";
>
>
> '/^(SELECT){1}[\ ]{0,}(CURRVAL\(\'){1}([a-zA-Z]+)(\'\)){1}$/i'
tu te fatigues bien la vie, l�... D�j�, vire tout le bordel inutile. Et
pense que si la requ�te est g�n�r�e par code, elle peut avoir des
espaces (sauts de lignes inclus) un peu partout.
"/^ *SELECT +CURRVAL *\( *'([a-zA-Z_]+)' *\) *$/i"
> // Deuxieme chaine a savoir intercepter
> "SELECT mavaleur FROM matable WHERE lechamp = 1234";
> '/^(SELECT){1} [\ ]{0,} ([a-z]){0,} (\.){0,1}
> (FROM){0,1} [\ ]{0,} ([a-z]){0,} (WHERE){0,1}
> [\ ]{0,}([a-z]){0,}[\ ]{0,}[=]{1}[\ ]{0,}([0-9]){0,}$/i'
Urg....
"/^ *SELECT +([a-zA-Z_]+) +FROM +([a-zA-Z_]+) +WHERE ([a-zA-Z_]+) *=
*([0-9]+) *$/i"
NB : Pas test�, mais �a devrait te remettre sur le bon chemin. Petits
rappels au passage:
- un litt�ral matche ce m�me litt�ral. Donc, "[=]" est une fa�on
inutilement compliqu�e d'�crire "=" (idem pour les espaces...)
- le quantifieur par d�faut est "{1,1}". Donc, "^(SELECT){1} " est une
fa�on inutilement compliqu�e d'�crire "^SELECT "
- "{0,}" s'�crit plus simplement "*"
- "{1,}" s'�crit plus simplement "+"
- "{0,1}" s'�crit plus simplenent "?"
D'une mani�re g�n�rale, n'utilise les quantifieurs complexes ("{,}") que
si tu en a vraiment besoin. Idem pour les groupements (parenth�ses) et
les classes ("[...]").
Accessoirement, en utilisant des doubles quotes pour d�finir ton
expression, tu n'a pas besoin d'�chapper les simples quotes, ce qui
am�liore quelque peu la lisibilit�.
Autre point: tu ne pr�cises pas le contexte d'utilisation, mais sauf si
tu a la main sur le code qui _g�n�re_ les requ�tes, parser du SQL �
coups de regexps est assez casse-gueule. Particuli�rement sur des
requ�tes SELECT. Je peux te donner quelques examples simples de SELECT
que ta regexp ne capturera pas:
SELECT * FROM ma_table WHERE mon_champ = 123;
SELECT champ1, champ2 FROM ma_table WHERE mon_champ = 123;
SELECT champ1 as tutu FROM ma_table WHERE mon_champ = 123;
SELECT ma_table.champ1 FROM ma_table WHERE ma_table.mon_champ = 123;
et je n'ai fait qu'effleurer la surface de l'iceberg - je pourrais t'en
tartiner des pages et des pages.
Moi j'aime bien le mot ᅵ rᅵgulaires ᅵ qui devrait mettre d'accord
(contre lui ?) aussi bien les tenants de ᅵ rᅵguliᅵres ᅵ que ceux de
ᅵ rationnelles ᅵ. ;-)
> [...]
>
> tu te fatigues bien la vie, lᅵ... Dᅵjᅵ, vire tout le bordel inutile. Et
> pense que si la requᅵte est gᅵnᅵrᅵe par code, elle peut avoir des
> espaces (sauts de lignes inclus) un peu partout.
>
> "/^ *SELECT +CURRVAL *\( *'([a-zA-Z_]+)' *\) *$/i"
Note qu'ici tu ne traites que les espaces, pas les tabulations ou les
sauts de ligne... Mais comme tu le dis plus loin il y a plein d'autres
cas qui ne sont pas forcᅵment traitᅵs non plus.
> [...]
>
>> '/^(SELECT){1} [\ ]{0,} ([a-z]){0,} (\.){0,1}
>> (FROM){0,1} [\ ]{0,} ([a-z]){0,} (WHERE){0,1}
>> [\ ]{0,}([a-z]){0,}[\ ]{0,}[=]{1}[\ ]{0,}([0-9]){0,}$/i'
>
> Urg....
:-D
> "/^ *SELECT +([a-zA-Z_]+) +FROM +([a-zA-Z_]+) +WHERE ([a-zA-Z_]+) *=
> *([0-9]+) *$/i"
Pour aller jusqu'au bout de la logique des espaces multiples, il manque
un '+' aprᅵs 'WHERE '.
> NB : Pas testᅵ, mais ᅵa devrait te remettre sur le bon chemin. Petits
> rappels au passage:
>
> [...]
Oui, c'ᅵtait une bonne idᅵe de les faire. Je rappelle pour ma part que
le groupe fr.comp.lang.regexp accueillera avec bienveillance toute
question sur les expressions rᅵgulaires (dᅵcidᅵment, ce terme me plaᅵt).
> Autre point: tu ne prᅵcises pas le contexte d'utilisation, mais sauf si
> tu as la main sur le code qui _gᅵnᅵre_ les requᅵtes, parser du SQL ᅵ
> coups de regexps est assez casse-gueule. [...] je pourrais t'en
> tartiner des pages et des pages.
[OUI]
Cordialement,
--
Olivier Miakinen
Je ne reviendrais pas sur les regex, Bruno a largement point� tes
maladresses. Par contre, il serait int�ressant d'expliquer ton besoin.
L'usage des regex n'est certainement pas une bonne id�e ici.
--
Micka�l Wolff aka Lupus Michaelis
http://lupusmic.org
yeps - je voulais y revenir mais j'ai oubliᅵ :(
>> "/^ *SELECT +([a-zA-Z_]+) +FROM +([a-zA-Z_]+) +WHERE ([a-zA-Z_]+) *=
>> *([0-9]+) *$/i"
>
> Pour aller jusqu'au bout de la logique des espaces multiples, il manque
> un '+' aprᅵs 'WHERE '.
Bien vu - merci pour les corrections !-)