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 27/03/2006, 14h02   #1
Invité régulier
 
Homme sebastien baudin
Développeur informatique
Inscription : février 2006
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme sebastien baudin
Âge : 34
Localisation : France, Vendée (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 14
Points : 7
Points : 7
Par défaut analyseur de requette SQL avec RegEx - [casse tête]

voir 3eme postes
sebbod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/03/2006, 16h25   #2
Invité régulier
 
Homme sebastien baudin
Développeur informatique
Inscription : février 2006
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme sebastien baudin
Âge : 34
Localisation : France, Vendée (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 14
Points : 7
Points : 7
j'ai trouvé donc je mets la réponse ça peut toujours servir a d'autre

$re = "/^ # Match start of string
(UPDATE\s+.+?) # listes des tables entre UPDATE et SET
(\s+SET\s+.+?=.+?,?.+?=\s*?'.+?') # listes des champs entre SET et WHERE
(\s+WHERE\s+.+?=.+?(\s+AND\s+)?.+?) # listes des conditions après WHERE
$ # Match end of string
/xi";
sebbod est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/03/2006, 10h56   #3
Invité régulier
 
Homme sebastien baudin
Développeur informatique
Inscription : février 2006
Messages : 14
Détails du profil
Informations personnelles :
Nom : Homme sebastien baudin
Âge : 34
Localisation : France, Vendée (Pays de la Loire)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 14
Points : 7
Points : 7
je mets ici le résultat de ma recherche
ces différents mask peuvent surement être amélioré mais déja il constitu une bonne base
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
 
function parse_query($query){
  $pos = strpos($query, "INSERT");
  if(!($pos === false)){
    return parse_insert($query);
  }
  $pos = strpos($query, "UPDATE");
  if(!($pos === false)){
    return parse_update($query);
  }
  $pos = strpos($query, "DELETE");
  if(!($pos === false)){
    return parse_delete($query);
  }
  $pos = strpos($query, "SELECT");  //en dernier car on peut trouver un SELECT dans les 3 précendents requettes
  if(!($pos === false)){
    return parse_select($query);
  }
}
 
function parse_insert($query){
  $re = "/^                                           # Match start of string
          INSERT\s+INTO\s(?P<tables>.+?)              # listes des tables qui vont subir l'insertion
          \s*
          (?P<fields>\(.+?,?.+?\))                    # listes des champs à insérer
          (?:
            \sVALUES\s(?P<values>\(.+?,?.+?\))?       # liste des valeurs à insérer
          |                                           # ou
            (?P<select>\sSELECT\s.+?)?                # select ramenant les valeurs à insérer
          )                 
         $                                            # Match end of string
         /sxim";
  preg_match($re, $query, $matches);
  return $matches;
}
 
function parse_update($query){
  $re = "/^                                             # Match start of string
        UPDATE\s+(?P<tables>.+?)                      # listes des tables entre UPDATE et SET
        \s+SET\s+(?P<set>.+?=\s*(?:'|\().*?(?:'|\))   # champ après le SET
                  \s*
                  (?:,                                # la virgule (,)
                    .+?=\s*(?:'|\().*?(?:'|\))        # listes des champs entre virgule (,)
                  )? 
        )
        \s+WHERE\s+(?P<where>.+?(\sAND\s)?.+?)        # listes des conditions après WHERE
       $                                              # Match end of string
       /sxim";
  if(!preg_match($re, $query, $matches)){
    $re = "/^                                             # Match start of string
        UPDATE\s+(?P<tables>.+?)                      # listes des tables entre UPDATE et SET
        \s+SET\s+(?P<set>.+?=\s*(?:'|\().*?(?:'|\))   # champ après le SET
                  \s*                                 # 1 seul champ updaté donc pas de virgule
        )
        \s+WHERE\s+(?P<where>.+?(\sAND\s)?.+?)        # listes des conditions après WHERE
       $                                              # Match end of string
       /sxim";  
    preg_match($re, $query, $matches);
  }
  return $matches;
}
 
function parse_delete($query){
  $re = "/^                                      # Match start of string
          DELETE\s+FROM\s+(?P<tables>.+?)        # listes des tables
          \s+WHERE\s+(?P<where>.+?(\sAND\s)?.+?) # conditions
         $                                       # Match end of string
         /sxim";
  preg_match($re, $query, $matches);
  return $matches;
}
 
function parse_select($query){
  $re = "/^                                 # Match start of string
          (SELECT\s+
            (?P<select>.+?)                 # liste des champs
          )                                 # obligatoire
          (?:\s+FROM\s+
            (?P<from>.+?)                   # liste des tables
          )                                 # obligatoire
          (?:\s+WHERE\s+
            (?P<where>.+?)                  # liste des conditions
          )?                                # facultatif
          (?:\s+GROUP\s+BY\s+
            (?P<group>.+?)                  # liste des champs du group
          )?                                # facultatif
          (?:\s+HAVING\s+
            (?P<having>.+?)                 # liste des conditions du having
          )?                                # facultatif
          (?:\s+ORDER\s+BY\s+
            (?P<order>.+?)                  # liste des champs du order
          )?                                # facultatif
         $                                  # Match end of string
         /sxim";
  preg_match($re, $query, $matches);
  return $matches;
}
 
/*  function parse_field_list($query)
 *
SAMPLE :
parse_field_list("Field_Name_1 = 'Field_Value', Field_Name_2 = (SELECT Field_Name_2 FROM Table_name WHERE ID_Table_name='x')");
retrun :
Array(
  [0] => Array(
    [0] => Field_Name_1 = 'Field_Value',
    [1] => Field_Name_2 = (SELECT Field_Name_2 FROM Table_name WHERE ID_Table_name='x')
  )
  [champs_val] => Array(
    [0] => Field_Name_1
    [1] => 
  )
  [val] => Array(
    [0] => Field_Value
    [1] => 
  )
  [champs_sql] => Array(
    [0] => 
    [1] => Field_Name_2
  )
  [sql] => Array(
    [0] => 
    [1] => SELECT Field_Name_2 FROM Table_name WHERE ID_Table_name='x'
  )
)
*/
function parse_set_list($query){
  $re = "/
        (?:                               # START parenthèse non capturante [valeur de type: ='valeur']
          (?P<champs_val>[[:alnum:]_\.]+)   # NOMS de champ avec une valeur de type: ='valeur'
          \s*=\s*                         # séparateur (=) entre le nom du champ et sa valeur
          '(?P<val>.*?)'                  # VALEURS de champ avec une valeur de type: ='valeur'
          \s*,?                           # test la présence d'une virgule (,) facultative
        )                                 # END parenthèse non capturante
        |                                 # ou
        (?:                               # START parenthèse non capturante [valeur de type: =(SELECT...FROM...WHERE...)]
          (?P<champs_sql>[[:alnum:]_\.]+)   # NOMS de champ avec une valeur de type: =(SELECT...FROM...WHERE...)
          \s*=\s*                         # séparateur (=) entre le nom du champ et sa valeur
          \((?P<sql>.+?)\)                # VALEURS de champ avec une valeur de type: =(SELECT...FROM...WHERE...)
          \s*,?                           # test la présence d'une virgule (,) facultative
        )                                 # END parenthèse non capturante
        /sxim";
  preg_match_all($re, $query, $matches);
  return $matches;
}
 
/*  function parse_values_list($query)
 *
SAMPLE :
parse_values_list("('Field_Value', (SELECT Field_Name_2 FROM Table_name WHERE ID_Table_name='x'))");
retrun :
Array(
  [0] => Array(
    [0] => 'Field_Value', 
    [1] => (SELECT Field_Name_2 FROM Table_name WHERE ID_Table_name='x')
  )
  [val] => Array(
    [0] => Field_Value
    [1] => 
  )
  [sql] => Array(
    [0] => 
    [1] => SELECT Field_Name_2 FROM Table_name WHERE ID_Table_name='x'
  )
)
 
*/
function parse_values_list($query){
  $re = "/
        (?:                               # START parenthèse non capturante [valeur de type: ='valeur']
          '(?P<val>.*?)'                  # VALEURS de champ avec une valeur de type: ='valeur'
          \s*,?\s*                           # test la présence d'une virgule (,) facultative
        )                                # END parenthèse non capturante
        |                                 # ou
        (?:                               # START parenthèse non capturante [valeur de type: =(SELECT...FROM...WHERE...)]
          \((?P<sql>.+?)\)                # VALEURS de champ avec une valeur de type: =(SELECT...FROM...WHERE...)
          \s*,?\s*                           # test la présence d'une virgule (,) facultative
        )                                # END parenthèse non capturante
        /sxim";
  preg_match_all($re, get_ensemble($query), $matches);
  return $matches;
}
function parse_fields_list($query){
  $matches = explode(",",get_ensemble($query));
  return $matches;
}
//retourne 1 le texte compris entre la première ( et la derniere ) de $query
//permet de supprimer les () dans les ensembles VALUES (...) ou INSERT INTO t1 , t2 (...)
//utilisé dans les fonctions:
//  -> parse_values_list
//  -> parse_fields_list
function get_ensemble($query){
  $re = "/^
        \s*
        \(
        \s*
        (?P<ensemble>.*?)
        \s*
        \)
        \s*
        $
        /sxim";
  preg_match_all($re, $query, $matches);
  return $matches["ensemble"][0];
}
sebbod 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 02h25.


 
 
 
 
Partenaires

Hébergement Web