Bonjour,

Je me permets de vous soumettre une colle sur laquelle je me casse les dents...

J'ai un champ de recherche de formulaire qui présente des structures de la forme :

"mot clé 1" OU "mot clé 2" OU ("mc 3" ET "mc 4") SAUF "mc 5"

Donc une succession de mots-clés avec les opérateurs ET, OU, SAUF qui peuvent intervenir dans n'importe quel ordre, avec éventuellement des parenthèses.

Je cherche à traduire ce champ de recherche en langage SQL. Ce qui devrait donner pour l'exemple ci-dessus :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
ma.table REGEXP '[[:<:]]mc 1[[:>:]]' OR ma.table REGEXP '[[:<:]]mc 2[[:>:]]' OR (ma.table REGEXP '[[:<:]]mc 3[[:>:]]' AND REGEXP '[[:<:]]mc 4[[:>:]]') AND ma.table NOT REGEXP '[[:<:]]mc 5[[:>:]]'
Précision du REGEXP '[[:<:]]blabla[[:>:]]' : je cherche le mot-clé exact, éventuellement noyé dans autre chose.

En recherche d'une idée miraculeuse (et surtout avec beaucoup d'essais plus au moins bien inspirés), je suis arrivé à un algo de la forme :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
$res = preg_replace("#^\"([^\"]*)\"#","$champ REGEXP '[[:<:]]$1[[:>:]]' ",$data);
$res = preg_replace ("#^SAUF \"([^\"]*)\"#","$champ NOT REGEXP '[[:<:]]$1[[:>:]]' ",$res);
$res = preg_replace ("#[^^]SAUF \"([^\"]*)\"#"," AND $champ NOT REGEXP '[[:<:]]$1[[:>:]]' ",$res);
$res = preg_replace("#ET \"([^\"]*)\"#","AND $champ REGEXP '[[:<:]]$1[[:>:]]' ",$res);
$res = preg_replace("#OU \"([^\"]*)\"#","OR $champ REGEXP '[[:<:]]$1[[:>:]]' ",$res);
Problèmes : cela ne répond pas a priori à 100% des requêtes qui peuvent être formulées, et ne me semble pas très propre...

Je suis à cours d'inspiration sur les approches possibles, je suis donc preneur de tout conseil

Many thanks !