Page 1 sur 1
Expressions régulières pour requete booléene
Posté : 04 févr. 2009, 12:28
par _nico_13
Bonjour,
JE cherche à mettre en place un formulaire de recherche avancé permettant de saisir dans un champ input x mots clés en écrivant une équation de type :
[mot1] ET [mot2]
ou encore : [ [mot1] OU [mot2] ] ET [mot3]
mais là je cale un peu au niveau des expressions régulières..
si qqun pouvait m'aiguiller
merci
Posté : 04 févr. 2009, 12:35
par albat
Personnellement, je me simplifierais la vie
en effectuant deux explode() successifs avec pour delimiteurs : 'ET' et 'OU'

Posté : 04 févr. 2009, 12:40
par Hywan
Hey

,
Oui on se simplifie la vie comme ça, mais ça reste un peu sale

. Si tu regardais du côté des expressions régulières couplées à preg_match_all(). Je réfléchis à une expression sympa qui prendrait tous les cas, mais si tu as des parenthèses à gérer, les expressions régulières seront trop limitées … (Autrement dit : est-ce que tu as des parenthèses à gérer ?).
Enfin, la précédence des opérateurs est importante car théoriquement AND et plus fort que OR. C'est le cas pour toi ? Ça implique que sur a AND b OR c, on va d'abord regarder a AND b, puis utiliser le résultat avec OR c.
Posté : 04 févr. 2009, 12:46
par _nico_13
Merci pour ces réponses express.
Dans l'idéal, j'aurais des parenthèses à gérer (sinon j'ai aussi pensé à ce que l'utilisateur créé ses sous requêtes et fusionne les résultats après pour éviter les imbrications).
Bien sur je serais plus partisant du preg_match_all(), je pense me servir de cette fct pour d'autres formulaires.
merci
Posté : 04 févr. 2009, 12:49
par albat
(Autrement dit : est-ce que tu as des parenthèses à gérer ?).
On dirait bien...
Lots of Insipid and Silly Parentheses

Posté : 04 févr. 2009, 12:52
par _nico_13
Le séparateur choisi [ n'est pas le mieux car il est utilisé dans les ereg, je peux mettre des $ ou tout autre séparateur...
Posté : 04 févr. 2009, 12:54
par Hywan
Oui, [ ou (, c'est pareil. On a l'idée de regroupement.
@albat : LISP, Lost In Stupid Privatejoke

? Si tu n'as retenu que les parenthèses dans LISP (ou
a fortiori dans Scheme), c'est bien dommage, car c'est une approche très intéressante. Et au moins, avec ce système de parenthèses, tu as une grammaire uniforme, pas de bidouille, toujours claire.
Posté : 04 févr. 2009, 14:28
par Berzemus
Tiens, je savais pas que tu étais passé sous Emacs..
Posté : 04 févr. 2009, 21:24
par blof
Bonsoir,
à la première lecture de la question j'avais cru comprendre qu'il fallait transformer une chaine de caractères issue d'une saisie dans un formulaire en une requête "select".
du genre :
devient
Code : Tout sélectionner
SELECT * FROM la_table WHERE le_champ='mot1' AND le_champ='mot2'
devient
Code : Tout sélectionner
SELECT * FROM la_table WHERE (le_champ='mot1' OR le_champ='mot2') AND le_champ='mot3'
... mais suite à la discussion qui a suivie j'ai un gros doute.
( à vrai dire je n'y comprends plus rien )
Peut-on me dire ?
Posté : 05 févr. 2009, 07:20
par blof
Code : Tout sélectionner
SELECT * FROM la_table WHERE le_champ='mot1' AND le_champ='mot2'
SELECT * FROM la_table WHERE (le_champ='mot1' OR le_champ='mot2') AND le_champ='mot3'
Je viens de relire.
On n'est pas près de ramener quelque chose avec ça ...
C'était un petit coup de fatigue ...
Posté : 05 févr. 2009, 10:12
par Invité
En fait il faut récupérer les critères pour construire plusieurs requetes.
En résumé : j'ai une table avec des fiches , j'ai une table des mots et une table de liaison lien_fiche_mots (1 fiche possède 0 à x mots).
Pour accélérer mes requetes, je procède comme ceci :
j'isole mes id fiches pour chaque mot saisi et après entre chaque 'condition' entre les mots je fais des array_merge, array_diff...
En fait j'ai beacoup de mal à écrire correctement la requête qui interroge en une fois la table (bien qu'en ayant mis des index sur les mots, cela rame à mort).
J'espère que c'est assez clair ?
Posté : 05 févr. 2009, 10:13
par _nico_13
(Désolé pas logué)
En fait il faut récupérer les critères pour construire plusieurs requetes.
En résumé : j'ai une table avec des fiches , j'ai une table des mots et une table de liaison lien_fiche_mots (1 fiche possède 0 à x mots).
Pour accélérer mes requetes, je procède comme ceci :
j'isole mes id fiches pour chaque mot saisi et après entre chaque 'condition' entre les mots je fais des array_merge, array_diff...
En fait j'ai beacoup de mal à écrire correctement la requête qui interroge en une fois la table (bien qu'en ayant mis des index sur les mots, cela rame à mort).
J'espère que c'est assez clair ?
Posté : 09 févr. 2009, 15:05
par Hywan
Hey

,
Alors, j'ai réfléchis de mon côté et je suis arrivé à la conclusion partielle suivante. Comme je le pensais, la syntaxe des expressions régulières Perl (et
a fortiori PHP) ne permet pas de déborder sur un langage algébrique (comme on peut pouvait s'y attendre …). Les conséquences immédiates sont qu'on ne peut pas vérifier la validité de l'expression donnée par l'utilisateur. Typiquement, on ne peut pas compter les crochets (respectivement [ et ]),
i.e. vérifier qu'il y a autant de [ que de ]. On pourrait bien sûr avec substr_count() mais c'est sale, ce n'est pas la meilleure façon d'opérer.
On peut y arriver, mais il faut développer plus de moyens (une sorte de
parser léger pour des expressions logiques — et arithmétiques ? —). Je me demandais si c'était bien nécessaire. Pourquoi ne pas tout simplement faire un formulaire plus fournit en listes par exemple ? Car l'idée de laisser l'utilisateur écrire du pseudo-code-SQL me met mal à l'aise

…
Posté : 09 févr. 2009, 15:41
par Calimero
On peut y arriver, mais il faut développer plus de moyens (une sorte de
parser léger pour des expressions logiques — et arithmétiques ? —). Je me demandais si c'était bien nécessaire. Pourquoi ne pas tout simplement faire un formulaire plus fournit en listes par exemple ? Car l'idée de laisser l'utilisateur écrire du pseudo-code-SQL me met mal à l'aise

…
Je plussoie, je ne sais pas quel est le besoin initial mais la solution me semble surpensée (au risque du coup de ne jamais être utilisée à cause de sa complexité intrinsèque). En plus d'être assez longue à implémenter...
Posté : 09 févr. 2009, 19:34
par Sékiltoyai
Tout cela est sans compter sur le
preg_replace_callback() qui te simule non sans excellence une analyse syntaxique
