Au secour ! moteur de recherche
Fermé
lirycs78
Messages postés
103
Date d'inscription
vendredi 7 juillet 2006
Statut
Membre
Dernière intervention
7 janvier 2010
-
28 août 2008 à 02:08
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 28 août 2008 à 10:58
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 28 août 2008 à 10:58
A voir également:
- Au secour ! moteur de recherche
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Google moteur de recherche page d'accueil - Guide
- Safari moteur de recherche - Télécharger - Navigateurs
- Installer qwant moteur de recherche - Télécharger - Navigateurs
- Copernic moteur de recherche - Télécharger - Navigateurs
1 réponse
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
28 août 2008 à 10:58
28 août 2008 à 10:58
Bonjour,
Ce qui ne va pas je pense c'est ta fonction de recherche. Notamment ce passage (gras) :
Tu lis 64 caractères par 64 caractères dans ton fichier. Donc à chaque lecture tu auras une chaine de caractère de 64 en taille (ou moins sur la fin). Donc si tu compare ce qui t'es retourné lors de la lecture à ce que tu cherches, tu vois bien que ça ne peut pas coller.
Un exemple simple : si tu cherche la chaine de caractère "toto" qui n'a qu'une taille de 4 et que tu lis "toto va a la plage". Lorsque tu testes une égalité stricte ==, c'est toute la chaine qui est comparée.
Une première modification serait donc de remplacer ton test par ce test là :
Ce test va regarder s'il trouve une occurence de ta chaine a trouver dans ce qui a été retourné lors de la lecture. S'il en trouve une, il retournera l'index / la position. Dans le cas où ce n'est pas trouvé, la fonction strpos retourne FALSE. Mais attention, pourquoi j'ai mis !== et pas simplement != ? Parce que !== fait une comparaison stricte avec la valeur booleen FALSE et non sa valeur numérique. On sait que FALSE équivaut au chiffre 0 et TRUE au chiffre 1. Si la position trouvée est 0 (l'occurrence à recherchée arriver en premier dans la chaine lue), le test != sera validé, alors que !== ne le sera pas (ce que nous voulons).
Ca devrait règler ton problème temporairement. Pourquoi temporairement ? parce que logiquement ton algorithme n'est pas optimal. Puisque tu lis 64 caractères par 64 caractères, tu peux très bien tombé sur le cas suivant :
- Admettons que tu recherches la chaine de caractère "toto"
- Dans ton fichier tu as exactement 128 caractères, soit deux lectures de 64 caractères. Admettons que la chaine "toto" se trouve pile a cheval sur ces deux lectures. La première lecture te retournera les 64 premiers caractères, dont à la fin les deux premiers de ta chaine "toto", à savoir "to". La deuxième lecture retournera la suite, le deuxième "to" de "toto". Conclusion : ta chaine ne sera pas trouvée et pourtant elle est bien dans ton fichier.
Solution : il faut lire tout le fichier d'un coup (ou alors concaténer son contenu dans une variable que tu stock).
Voilà la modification du code pour le faire :
Le code n'a pas été testé mais ça devrait résoudre ton problème.
Ce qui ne va pas je pense c'est ta fonction de recherche. Notamment ce passage (gras) :
function search($search){ $ligne = 1; $pfichier = fopen("mots.txt","r"); while ($ch = fgets($pfichier, 64)) { if ($ch == "$search"){ echo "$ch"; } elseif ($ch != "$search"){ echo "Erreur !"; } } }
Tu lis 64 caractères par 64 caractères dans ton fichier. Donc à chaque lecture tu auras une chaine de caractère de 64 en taille (ou moins sur la fin). Donc si tu compare ce qui t'es retourné lors de la lecture à ce que tu cherches, tu vois bien que ça ne peut pas coller.
Un exemple simple : si tu cherche la chaine de caractère "toto" qui n'a qu'une taille de 4 et que tu lis "toto va a la plage". Lorsque tu testes une égalité stricte ==, c'est toute la chaine qui est comparée.
Une première modification serait donc de remplacer ton test par ce test là :
if ( strpos($search,$ch) !== FALSE )
Ce test va regarder s'il trouve une occurence de ta chaine a trouver dans ce qui a été retourné lors de la lecture. S'il en trouve une, il retournera l'index / la position. Dans le cas où ce n'est pas trouvé, la fonction strpos retourne FALSE. Mais attention, pourquoi j'ai mis !== et pas simplement != ? Parce que !== fait une comparaison stricte avec la valeur booleen FALSE et non sa valeur numérique. On sait que FALSE équivaut au chiffre 0 et TRUE au chiffre 1. Si la position trouvée est 0 (l'occurrence à recherchée arriver en premier dans la chaine lue), le test != sera validé, alors que !== ne le sera pas (ce que nous voulons).
Ca devrait règler ton problème temporairement. Pourquoi temporairement ? parce que logiquement ton algorithme n'est pas optimal. Puisque tu lis 64 caractères par 64 caractères, tu peux très bien tombé sur le cas suivant :
- Admettons que tu recherches la chaine de caractère "toto"
- Dans ton fichier tu as exactement 128 caractères, soit deux lectures de 64 caractères. Admettons que la chaine "toto" se trouve pile a cheval sur ces deux lectures. La première lecture te retournera les 64 premiers caractères, dont à la fin les deux premiers de ta chaine "toto", à savoir "to". La deuxième lecture retournera la suite, le deuxième "to" de "toto". Conclusion : ta chaine ne sera pas trouvée et pourtant elle est bien dans ton fichier.
Solution : il faut lire tout le fichier d'un coup (ou alors concaténer son contenu dans une variable que tu stock).
Voilà la modification du code pour le faire :
function search($search,$file_name){ $content = file_get_contents($file_name); if ( strpos($search,$content) !== FALSE ) echo "<BR>trouve"; else echo "<BR>Erreur, pas trouve"; }
Le code n'a pas été testé mais ça devrait résoudre ton problème.