Analyse lexicale, comment faire?

Signaler
Messages postés
8
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006
-
Messages postés
8
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006
-
Bonjour,
J'aimerai définir des criticités à des produits de ma base de données, ceux-ci seront définit par l'utilisateur, exemple de saisie possible:
   vert: taille>26 ET {poids<120 OU encombrement>100}
   jaune: taille>26 
   rouge:taille<26 ET {poids>120 OU encombrement>1000}

j'aimerai analyser cette chaine de caractères, cependant le problème peut devenir assez complexe, et je voulais savoir si vous avez des idées pour résoudre ce problème dans un premier temps OU bien si vous pouvez me proposer une autre solution (autre type de saisie, éventuellement) pour ce problème .
 Merci.. 

13 réponses

Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
Hello,

le mieux est encore sans doute de créer un formulaire adapté. Histoire d'éviter un parsing.
Sinon, il te reste à définir ta grammaire, et créer les règles avec des expressions régulières.
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Salut,

je rejoins l'idée de malalam concernant les expression régulières.
Messages postés
8
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

pour le formulaire , c'est ne va pas trop parce que pour l'instant on ne sait toujours pas comment est ce que l'on va définir les criticités et aussi quelle paramètres aura une incidence dans la criticité.
sinon les pour les expressions régulières est ce que vous pouvez me donner un exemple pour que je vois comment vous faites.
Merci pour votre réponse en tout cas.
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Salut,

voici une petite aide(si j'ai bien tout compris) :
<?php
function parse_string($pString,$pPattern) {
$charac = array();
preg_match_all($pPattern,$pString,$matches,PREG_SET_ORDER); //départ de l'analyse de la chaine
$num = count($matches);
#enregistrement des données récupérées dans un tableau plus facile à lire
for ($i=0; $i<$num; $i++) {
$charac[ $matches[$i][1] ] = $matches[$i][2];
}
return ($charac);
}

$string = "je veux un marteau de #couleur:verte ayant une #taille:16 et pesant un #poids:10"; //chaine à analyser
$pattern = '`#(couleur|taille|poids):([a-z0-9]+)`i'; //forme des entités à récupérer

$infos = parse_string($string,$pattern);
# affichage des infos retournées
echo "Caractéristiques de mon marteau:
\n";
foreach ($infos as $nom=>$val) {
echo "$nom - $val
\n";
}
?>

adresse trés utilise: www.php.net / recherche: preg_... ou regex
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
Salut!
Le pb c'est que faisant ça, tu loupes l'ordre des opérateurs (et la prédominance des { })

@++

R@f

www.allpotes.ch: Photos, humour, vidéos, gags, ...
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
Messages postés
8
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

oui effectivement, ce type de parsing revient a tout considérer comme une relation de ET entre les conditions : mais c'est pas trop ce que je voulais faire.
Cependant cette idée est interessante.
Il me semble qu'utiliser une décomposition en un arbre de l'expression permettrait déjà de simplifier le problème.
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
Oui, c'est ce à quoi, je pensais:
tu pourrais déjà parser selon les opérateurs ( ET, OU ) et les délimiteurs ( { } ) en un arbre. Ensuite, pour chaque item, il faudra effectuer la recherche des critères...

@++

R@f

www.allpotes.ch: Photos, humour, vidéos, gags, ...
"On dit que seulement 10 personnes au monde comprenaient Einstein. Personne ne me comprends. Suis-je un génie???"
Messages postés
8
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

yaurai pas qqn qui a deja fait une classe arbre en PHP?
merci
Messages postés
8
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

je viens d'avoir une autre idée qui est beaucoup plus simple :


d'utiliser la fonction eval de php.


de remplacer ET par &&,  OU par ||, allongement par $allongement


dans la chaine de caractère à l'aide de replace.


et enfin d'utiliser la fonction eval tout en assurant que les variables ont été créé auparavant.
Cette façon de résoudre le problème étant beaucoup plus simple


 
Messages postés
239
Date d'inscription
samedi 21 février 2004
Statut
Membre
Dernière intervention
3 juin 2010
1
Il s'agit d'un exemple.
Messages postés
8
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

oui, effectivement il peut y avoir plusieurs solutions, mais finalement il n'est pas forcément nécessaire de faire un traitement de chaine de caractère.
bon voila merci en tout cas pour vos idée.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
26
J'espère que c'est pour une utilisation limitée, avec des utilisateurs en qui tu as confiance.
Parce que... : saisie utilisateur + eval ()... dans le genre super, méga dangereux, on peut pas faire beaucoup mieux.
Messages postés
8
Date d'inscription
samedi 20 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

Oui effectivement tu as raison, mais les utilisateurs pouvant accéder à cette partie du site seront forcément des utilisateurs Administrateur. Cependant, je comprends que ce n'est pas très astucieux, mais je vois pas comment faire plus simplement, étant donné que la complexité du problème me dépasse un peu. Si tu as une meilleure idée, n'hésite pas...