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 :
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 :
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 !
Partager