Dire si des mots se trouvent dans une chaîne

Dire si des mots se trouvent dans une chaîne - PHP - Programmation

Marsh Posté le 07-08-2006 à 12:50:32    

Salut la compagnie,
 
Imaginez que vous avez 1 mot dans $mot1 et un dans $mot2. Imaginez aussi que vous avez une chaînes de caractères. Maintenant comment vous faites pour savoir si :  
 
- $mot1 ET $mot2 se trouvent dans la chaîne.
- $mot1 OU $mot2 se trouvent dans la chaîne.
- $mot1 SAUF $mot2 se trouvent dans la chaîne.
 
Les opérateurs peuvent donc varier entre ces 3 là. J'étais partis pour faire une tripotée de SI mais c'est ingérable lorsque le nombre de mots monte à 4 (maximum).
 
J'ai essayé les expressions régulières mais sans expériences dans le domaine, je n'y arrive pas. Les recherches que j'ai effectués m'ont ammené à faire celui-ci mais ça ne semble pas marcher.
 
Pour le ET : /(?:mot1)+|(?:mot2)+/i
Pour le OU : /(?:mot1)*|(?:mot2)*/i
Pour le SAUF : /(?:mot1)+|(^?:mot2)/i
 
Voilà, des idées ? parce que je sèche depuis quelque jours là.

Reply

Marsh Posté le 07-08-2006 à 12:50:32   

Reply

Marsh Posté le 07-08-2006 à 12:55:40    

Je ne vois pas ou est le probleme.
Tu fait une fonction de test avec 3 if et c terminé.... tu n as en aucun cas besoin d'une flopée de tests....
Il existe des fonctions  php qui vérifient si une chaine est comprise dans une auter et renvoie 1 ou 0 ou true or  false je ne sai plus en cas de succes ou d echec. regarde donc de ce  coté la.
Recherche string php sous google et tu aura ta réponse.

Reply

Marsh Posté le 07-08-2006 à 13:05:27    

Et quand y'a 4 mots clé qui peuvent se lier de cette manière :
 
mot1 ET mot2 OU mot3 SAUF mot4
mot1 SAUF mot2 ET mot3 OU mot4
 
C'est aussi facile avec 3 if ? J'ai du mal moi ^^

Reply

Marsh Posté le 07-08-2006 à 13:40:14    

avec tes ET et OU ecrits comme ça, on est pas bien sur de ce que tu veux :o
Bon au lieu d'utiliser strpos dans ton cas j'utiliserais un strplit et in_array
Un truc dans le genre:

Code :
  1. if ( in_array(array($mot1, $mot2, $mot3), strsplit($str)) && ! in_array(array($mot4), strsplit($str)) ){
  2. // ...
  3. }


edit:
Tu n'as même pas besoin du array($mot4) tu peux passer juste $mot4 quand tu n'as qu'un mot!


Message édité par anapajari le 07-08-2006 à 13:40:56
Reply

Marsh Posté le 07-08-2006 à 13:47:55    

Le formulaire avec les mots-clé :
http://xtremsplit.free.fr/test.jpg
 
Le résultat (faux) retourné :
http://xtremsplit.free.fr/test2.jpg
 
J'vois pas comment vous arrivez à traiter tous les cas possibles en fait avec les SI :sleep:  
 
A moins qu'après avoir récupéré toussa, je fais un tableau de ET, un tableau de OU et un tableau de SAUF que je manipule avec les SI, y'a ptet moyen que ça marche comme ça :D

Reply

Marsh Posté le 07-08-2006 à 13:54:39    

ton formulaire est pas super clair :/
si je fais mot1 et mot2 et mot3 ou mot4
ca sera mot1+mot2+mot3 ou mot4 ou mot1+mot2 et mot3ou4 ?

Reply

Marsh Posté le 07-08-2006 à 13:57:48    

ça sera mot1+mot2+mot3 ou mot4
 
edit : tous les mots avec ET doivent se trouver dans le résultat. Si un mot à un OU, alors que ce mot soit dans le résultat ou non c'est pas grave. Et si le mot à un SAUF alors dès que ce mot est dans le résultat, peu importe si les autres mots sont trouvés ou non, on retire le résultat de la liste, un SAUF est éliminatoire si j'ose dire ^^

Message cité 1 fois
Message édité par Inekman le 07-08-2006 à 14:00:40
Reply

Marsh Posté le 07-08-2006 à 14:13:27    

Inekman a écrit :

ça sera mot1+mot2+mot3 ou mot4
 
edit : tous les mots avec ET doivent se trouver dans le résultat. Si un mot à un OU, alors que ce mot soit dans le résultat ou non c'est pas grave. Et si le mot à un SAUF alors dès que ce mot est dans le résultat, peu importe si les autres mots sont trouvés ou non, on retire le résultat de la liste, un SAUF est éliminatoire si j'ose dire ^^


Euhh bin s'pas clair toujours hein :/
Si: mot1 ET mot2 OU mot3 ET mot4
Tu dis on cherche les chaines qui comportent mot1+mot2+mot4 et on s'en fout si il y a mot3 ou pas c'est ça?
Mais donc si j'ai la chaine suivante: "mot1 mot3 mot4" ça marche pas?
 

Reply

Marsh Posté le 07-08-2006 à 14:19:23    

anapajari a écrit :

Euhh bin s'pas clair toujours hein :/
Si: mot1 ET mot2 OU mot3 ET mot4
Tu dis on cherche les chaines qui comportent mot1+mot2+mot4 et on s'en fout si il y a mot3 ou pas c'est ça?
Mais donc si j'ai la chaine suivante: "mot1 mot3 mot4" ça marche pas?


Et ben voilà, t'as tout compris pourtant ^^ Ca marche pas car mot2 qui est connecté par un ET n'est pas dans le résultat. Y'a pas de parenthèse pour préciser les priorités à savoir (mot1 ET mot2) OU (mot3 ET mot4) ou encore mot1 ET (mot2 OU mot3) et mot4. Je m'en fiche de ça en fait.  
 
Avec un ET il doit y avoir 1 ou plusieurs occurrences du mot
Avec un OU il doit y avoir 0 ou plusieurs occurrences du mot
Avec un SAUF, on ôte la chaîne de la liste des résultats retournés.

Reply

Marsh Posté le 07-08-2006 à 14:22:10    

oui donc OU sert strictement à rien en fait :o
 
Tu reprends le bout de code que je t'ai donné plus haut, dans le premier in_array tu mets les mots reçus avec ET, dans le deuxième les mots reçus avec sauf et roulez jeunesse!

Reply

Marsh Posté le 07-08-2006 à 14:22:10   

Reply

Marsh Posté le 07-08-2006 à 14:26:24    

Yes je vais regarder ça :)

Reply

Marsh Posté le 07-08-2006 à 14:50:33    

Bon y'a une couille dans le potage :??:  
 

$tabchaine = explode(' ', strtolower($chaine));
 
print_r($tabchaine);
 
if (in_array($tabET, $tabchaine))    
    echo 'trouvé';
else echo 'pas trouvé';


tableau de ET :
Array ( [0] => projet )
 
Chaînes :
Array ( [0] => accès [1] => aux [2] => dossiers [3] => découvrir [4] => le [5] => projet )
pas trouvé
 
Array ( [0] => accès [1] => aux [2] => dossiers [3] => découvrir [4] => le [5] => projet [6] => ressources )
pas trouvé
 
Array ( [0] => accès [1] => aux [2] => dossiers [3] => découvrir [4] => le [5] => projet [6] => aide [7] => technique )
pas trouvé


J'ai couillé ? :sleep:

Reply

Marsh Posté le 07-08-2006 à 15:02:31    

raaah scuz c'est moi qu'y ait fumé le moquette, si tu passes un array en 1er paramètre il cherche un array entier dans le 2eme array paramètre, et non chaque élement du 1er ( phrase super pas claire ...).
Bon en gardant la même idée on va ruser en utilisant array_intersect:

Code :
  1. if(array_intersect($tabET, $tabchaine) == $tabET)


Pour le sauf, tu peux utiliser array_diff de la même manière

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed