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 12/04/2007, 19h33   #1
Nouveau Membre du Club
 
Inscription : avril 2002
Messages : 84
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 84
Points : 33
Points : 33
Par défaut Capturer une chaîne en dehors de parenthèses

Bonjour,

je recherche le moyen de capturer un morceau de chaine qui ne soit pas entre '' ou entre ()

par exemple:
Code :
1
2
 
SELECT * FROM table WHERE ID IN (SELECT * FROM Table)
ici je veux capturer le FROM qui n'est pas entre ()
doc je fais:
Code :
1
2
3
 
$query = "SELECT * FROM table WHERE ID IN (SELECT * FROM Table)";
preg_match("/LIMIT(.*)/msi", $query, $match);

Merci de votre aide
laurent_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/04/2007, 20h55   #2
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Salut,

Peut-être avec preg_split

Code PHP :
1
2
$r = preg_split('#\(.*\)#msi', $query, -1, PREG_SPLIT_NO_EMPTY);
print_r($r);
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 17h34   #3
Nouveau Membre du Club
 
Inscription : avril 2002
Messages : 84
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 84
Points : 33
Points : 33
Merci pour ta réponse,
en fait je doit capturer le texte premier SELECT jusqu'au FROM sans parenthèses mais en gardant le contenu entre parenthèse

par exemple:

le regex doit me retourner *

Code :
1
2
 
$sql= 'SELECT * FROM table WHERE ID IN (SELECT * FROM Table)';
Merci
laurent_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2007, 17h58   #4
Membre expérimenté
 
Inscription : septembre 2006
Messages : 685
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 685
Points : 564
Points : 564
Dans ce cas, oui alors, preg_match est suffisant.

Code php :
1
2
3
$sql= 'SELECT champ1, champ2, champ3 FROM table WHERE ID IN (SELECT * FROM Table)';
preg_match('#SELECT (.+) FROM .+#Usi', $sql, $match);
echo $match[1];

Il ne te retournera que la 1ère occurence trouvée, et comme le 1er SELECT n'est jamais entre parenthèse, un masque simple est suffisant.
Xunil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/04/2007, 16h46   #5
Nouveau Membre du Club
 
Inscription : avril 2002
Messages : 84
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 84
Points : 33
Points : 33
merci de la réponse mais il y a une autre fom de string

Code :
1
2
3
4
5
6
7
8
9
 
$sql= 'SELECT * FROM table WHERE ID IN (SELECT * FROM Table)';
 
ou bien 
 
$sql= 'SELECT 
*, 
(select * from matable) AS test 
FROM table WHERE ID IN (SELECT * FROM Table)';
le select et le form ne doivent pas être entre parenthèses en fait

Merci de ton aide
laurent_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 09h30   #6
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
J'arrive pas à comprendre ton histoire de parenthèses de from etc. En gros tu veux capturer quoi ? La liste des colonnes de ta requete ? Les noms des colonnes (alias plutot que (select ...)) ?
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 10h11   #7
Nouveau Membre du Club
 
Inscription : avril 2002
Messages : 84
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 84
Points : 33
Points : 33
En gros, je veux capturer tout ce qui se trouve entre SELECT et FROM, dont ni le SELECT ni le FROM ne soient pas entre parenthèse, ni entre quotes

Merci de ton aide
laurent_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2007, 10h43   #8
Membre chevronné
 
Avatar de Korko Fain
 
Étudiant
Inscription : août 2005
Messages : 632
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2005
Messages : 632
Points : 632
Points : 632
Et dans ce cas là, il te retourne quoi ?

Code :
1
2
3
4
$sql= 'SELECT 
*, 
(select * from matable) AS test 
FROM table WHERE ID IN (SELECT * FROM Table)';
Korko Fain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2007, 18h31   #9
Nouveau Membre du Club
 
Inscription : avril 2002
Messages : 84
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 84
Points : 33
Points : 33
Merci de votre aide

cela me retourne

Citation:
Array
(
[0] => SELECT
*,
(select * from m
[1] =>
*,
(select *
)

laurent_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2007, 19h27   #10
Nouveau Membre du Club
 
Inscription : avril 2002
Messages : 84
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 84
Points : 33
Points : 33
Je pense avoir trouver une solution, je vais faire un remplacement des mots entre quotes ou parenthèses afin de palier au problème

euh, quelqu'un saurait comment remplacer un mot entre parenthèse
par exemple

Citation:
$sql= "SELECT
*,
(SELECT * FROM matable WHERE 1=1) AS test
FROM
table
WHERE
ID IN (SELECT * FROM Table WHERE 1=1) AND
a LIKE '%WHERE 1=1%'
GROUP BY
test
ORDER BY
tests";
je veux remplacer les mots FROM entre parentèses ou guillemets par [:FRXM:]



Merci
laurent_h est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/04/2007, 01h14   #11
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
j'imagine que tu veux pouvoir chercher n'importe quoi comme de WHERE à GROUP BY. à mon avis, le méta-caractère le plus puissant est | car il offre la possibilité de mettre des patterns entier en concurrence entre eux. dans ce cas-ci, il faut passer par dessus tout ce qui est entre parenthèses et entre quote SQL qui sont '` si ma mémoire est bonne. et tout le reste est bon... donc on peut opposer ces 3 patterns.

en utilisant l'option U (ungreedy) sur toute l'expression, alors on peut dire que le contenu entre parenthèses est détecté par le pattern \(.+\) et dans la même logique que le contenu entre quote SQL '` est détecté par le pattern ['`].+['`] avec une nuance... et que le troisième pattern est tout simplement le point.

faire un masque de ces 3 patterns et capturer en \\1 dès le début pour éliminer par exemple le WHERE qui serait entre parenthèses ou quote avant le WHERE voulu. ensuite une simple référence à ce masque pour reproduire ces patterns en | comme une sous routine entre par exemple le WHERE et le GROUP BY.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
$sql= "SELECT
*,
(SELECT * FROM matable WHERE 1=1) AS test
FROM
table
WHERE
ID IN (SELECT * FROM Table WHERE 1=1) AND
a LIKE '%GROUP BY%'
GROUP BY
test
ORDER BY
tests";
 
$debut='WHERE';
$fin='GROUP BY';
 
if(preg_match('#(\(.+\)|([`\']).+\2|.)*'.$debut.'\s+((?1)+)\s+'.$fin.'#Usi',$sql,$match)) {
  echo $match[3];
}
tu peux énumérer les quotes SQL dans ([`\']) si ma mémoire est défectueuse. et si ma suggestion ci-haut ne te plait pas, tu peux aussi regarder du coté des masques conditionnels.
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h28.


 
 
 
 
Partenaires

Hébergement Web