Bonjour à tous,

Je suis en train de créer une expression régulière permettant de me découper une requête de sélection simple (pas de requêtes imbriquées). J'ai fait quelques recherches (tuto, forum) et je reste bloqué...

Le but est couper la requête en plusieurs morceaux :
  • SELECT et les champs sélectionnée
  • FROM et les tables sélectionnées
  • ORDER BY et les champs

Voici le code utilisé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
//Requête à traiter
$sql = "SELECT user_id, user_name 
FROM user
ORDER BY ";
 
$tab =preg_match('/^.*(SELECT){1,1}(.*)(\nFROM| FROM){0,1}(.*)(\nORDER BY| ORDER BY){0,1}(.*)/i',$sql,$resultat); 
// /^.* Sélection des caractères avant le select (permet de supprimer les blancs)
//(SELECT){1,1}(.*) Récupération du SELECT et des champs sélectionés
//(\nFROM| FROM){1,1}(.*) Sélection du FROM et des tables appelées (le FROM peut être séparé soit par un espace soit par un retour chariot)
//(\nORDER BY| ORDER BY){0,1}(.*) Sélection du ORDER BY et des champs d'ordre (le ORDER BY peut ne pas être présent et peut être séparé soit par un espace soit par un retour chariot)
// /i (la casse n'est pas importante)
Le souci c'est la gestion du "ORDER BY" qui peut ne pas être présent dans la requête. Si jamais il y a un "ORDER BY" celui-ci n'est pas écrit dans le tableau dans des champs différents (présent dans le même champ que le FROM). Si le ORDER BY n'est pas présent, l'expression régulière n'est pas bonne... Je ne sais donc pas trop quoi faire.

N'hésitez pas à me faire par de vos remarques quant à l'expression régulière en elle-même.

Merci d'avance