Ok, cela va être une grande réponse.
Je pense que vous avez besoin d'un générateur d'analyseur. Un logiciel qui génère du code pour analyser le texte en fonction d'une grammaire donnée. Ces analyseurs ont souvent 2 composants principaux: un lexeur et un analyseur. Le lexer identifie TOKENS (mots), l'analyseur vérifie si l'ordre du jeton est correct selon votre grammaire.
Dans le lexer, vous devez déclarer les jetons suivants
TOKENS ::= (AND, OR, NOT, WORD, WORDSTAR, LPAREN, RPAREN, QUOTE)
WORD ::= '/w+/'
WORDSTAR ::= '/w+\*/'
La grammaire doit être définie comme ceci:
QUERY ::= word
QUERY ::= wordstar
QUERY ::= lparen QUERY rparen
QUERY ::= QUERY and QUERY
QUERY ::= QUERY or QUERY
QUERY ::= QUERY and not QUERY
QUERY ::= quote MQUERY quote
MQUERY ::= word MQUERY
MQUERY ::= word
Cette grammaire définit une langue avec toutes les fonctionnalités de votre besoin. Selon le logiciel que vous utilisez, vous pouvez définir des fonctions pour gérer chaque règle. De cette façon, vous pouvez transformer votre requête textuelle en une clause sql where.
Je ne suis pas vraiment en PHP, mais j'ai cherché sur le web pour un générateur d'analyseur et PHP_ParserGenerator est apparu. Gardez à l'esprit que tant que votre base de données se développe, ces requêtes peuvent devenir un problème pour un système de stockage structuré.
Vous voudrez peut-être essayer un moteur de recherche de texte intégral qui vous permet d'effectuer ceci et beaucoup d'autres dispositifs liés à la recherche de texte. C'est ainsi que fonctionne IndexTank
D'abord, vous ajoutez (ou 'indexez' dans le dialecte de recherche) tous vos enregistrements de db (ou documents) à IndexTank.
$api = new ApiClient(...);
$index = $api->get_index('my_index');
foreach ($dbRows as $row) {
$index->add_document($row->id, array('text' => $row->text));
}
Après cela, vous pouvez effectuer une recherche dans l'index avec tous les opérateurs que vous voulez
$index = $api->get_index('my_index');
$search_result = $index->search('Apples AND Oranges');
$search_result = $index->search('Apples OR Oranges');
$search_result = $index->search('Apples AND NOT Oranges');
$search_result = $index->search('"apples oranges"');
$search_result = $index->search('Apples AND (Oranges OR Pears)');
$search_result = $index->search('Appl*');
J'espère avoir répondu à votre question.
Normalement, vous devez d'abord marquer l'entrée, puis exécuter un analyseur sur les données à jetons. Mon [convertisseur print_r] (https://gist.github.com/1102761) fait quelque chose de similaire, cependant, il a une grammaire différente. – hakre