Gestion des accents pour un moteur de recherche PHP

Nouveau WRInaute
Salut,

Connaissez-vous le moyen de rechercher en PHP un mot dans une base quelconque avec ou sans accent ?

Merci beaucoup.

Fredo[/quote]
 
WRInaute impliqué
Je n'ai peut-être pas bien compris ta question mais il suffit de stocker les données dans ta base sans accent et d'enlever les accents du mot recherché avant de fouiller dans tes petits octets...

Pour enlever les accents tu peux utiliser un truc du genre:
Code:
function sans_accent($chaine)
{
	$accent  ="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ";
	$noaccent="aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyyby";
	return strtr(trim($chaine),$accent,$noaccent);
}

C'est une solution ultra-simple, il y en a d'autres...
 
WRInaute accro
dans sa base, il a :
événement
évènement
evenement

en faisant une recherche avec evenement, l'ideal serait que les 3 ressortent ...

c'est bien cela ?
 
WRInaute passionné
mahefarivony a dit:
en faisant une recherche avec evenement, l'ideal serait que les 3 ressortent ...

Pour ma part, avec MySQL et en ne faisant rien de spécial, c'est ce qui se produit.
Mes champs sont de type TEXT (insensible à la casse). Il en serait peut-être autrement avec un champ BLOB.

Fred
 
J
JPC
Guest
de toutes façons, l'attitude par rapport aux majuscules particulièrement, et aussi aux accents, ça dépend fortement de la base de données et de sa configuration...
 
Nouveau WRInaute
mahefarivony a dit:
dans sa base, il a :
événement
évènement
evenement

en faisant une recherche avec evenement, l'ideal serait que les 3 ressortent ...

c'est bien cela ?

Exactement
Avec l'inverse éventuellement : en cherchant évènement on trouverait evenement
 
Nouveau WRInaute
Remi L. a dit:
Je n'ai peut-être pas bien compris ta question mais il suffit de stocker les données dans ta base sans accent et d'enlever les accents du mot recherché avant de fouiller dans tes petits octets...

Pour enlever les accents tu peux utiliser un truc du genre:
Code:
function sans_accent($chaine)
{
	$accent  ="ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûýýþÿ";
	$noaccent="aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyyby";
	return strtr(trim($chaine),$accent,$noaccent);
}

C'est une solution ultra-simple, il y en a d'autres...

------------------------

Merci pour cette astuce. Le problème est que les chaînes stockées dans des champs 'VARCHAR' et 'TEXT' contiennent nécessairement des accents. Je vais voir comment adapter cette fonction.
 
Nouveau WRInaute
Ma requête SQL de recherche est du genre :
SELECT * FROM table WHERE champs = '$expression_recherchee'

Le but étant de supprimer les accents, on applique la fonction sans_accent() sur la variable PHP $expression_recherchee.

Mais il faut aussi appliquer le même genre de fonction (en version SQL) sur le champs de la table.

Existe-t-il une astuce (équivalent SQL de strtr() ou autre) ?
 
Nouveau WRInaute
The Jedi a dit:
Et actuellement ça te retourne quoi pour l'exemple avec le mot 'évènement' ?

Quand je tape 'évènement', mon moteur ne peut retourner que 'évènement' (et pas 'evenement').

Quand je tape 'evenement', mon moteur ne peut retourner que 'evenement' (et pas 'évènement').

Autrement dit, il ne peut faire la recherche que sur le mot tel qu'il est saisi au clavier.
 
WRInaute passionné
Ta base de données c'est Mysql ? Quelle version ? Le type de tes champs ?
Parce que je viens encore de tester pour être sûr, et avec un champ TEXT ou VARCHAR, 'événement' ressort pour une recherche sur 'evenement', 'évenement', 'événement', 'évênëmènt', etc.
Et inversement, 'evenement' ressort pour une recherche sur 'événement', 'evénement', etc.

Fred
 
J
JPC
Guest
c'est clair chaque base a sa façon de gérer les majuscules et accents, ses paramètres à ce sujet etc... et même son langage, si tu voulais trnasformer le contenu (transac-sql pour sql serveur pour l'exemple puisque lui a même un nom ;-) )
 
Nouveau WRInaute
George Abitbol a dit:
Ta base de données c'est Mysql ? Quelle version ? Le type de tes champs ?
Parce que je viens encore de tester pour être sûr, et avec un champ TEXT ou VARCHAR, 'événement' ressort pour une recherche sur 'evenement', 'évenement', 'événement', 'évênëmènt', etc.
Et inversement, 'evenement' ressort pour une recherche sur 'événement', 'evénement', etc.

Fred

Ma base est de type MySQL et mes champs des TEXT et VARCHAR.

Maintenant, ça marche. J'ai enfin compris que la fonction LIKE permet la recherche d'une chaîne de caractères sans tenir compte des accents.

Vos réponses m'ont beaucoup aidé. Merci !
 
WRInaute passionné
Fredo a dit:
J'ai enfin compris que la fonction LIKE permet la recherche d'une chaîne de caractères sans tenir compte des accents

Je voudrais pas avoir l'air d'insister :D mais quand j'ai fait mes tests, c'était avec = et pas avec LIKE (mais ça marche avec les deux).
Enfin bon, de toute façon, si c'est pour une recherche mieux vaut effectivement utiliser LIKE, mais alors autant le faire avec % de part et de d'autre du mot à rechercher...

LIKE '%eve%' <-- trouve 'eve', 'évènement', 'rêve', 'grèves', etc.

Fred
 
Nouveau WRInaute
Bonjour,

Je reprend cette discussion car je suis pile sur le sujet en ce moment...

Je suis en train d'installer isearch (http://www.isearchthenet.com/isearch/) pour remplacer Atomz sur mon site et j'ai un souci avec les accents.

Je voudrais obtenir le comportement décrit précédemment ou le mot "evenement" recherché matcherait les mots "évènement", "evènement", "évenement" etc...

L'implémentation de isearch utilise REGEXP dans les requêtes SQL et je n'ai pas le comportement voulu.

J'ai bien lu le premier post qui suggère de stocker en base le texte sans accent et de comparer les mots sans accent à cette base, mais ça rend la page de résultats un peu bizarre avec le texte sans accent.

Est ce que quelqu'un a d'autres trucs qui me permettraient de matcher les mots avec et sans accents tout en continuant à indexer le site avec les accents?

Merci.
 
WRInaute accro
Bon je sai que le topic est oublié depuis quelques siècles mais comme il m'a servi a résoudre un problème, je pose ma petite pierre sur le sujet.

Mon problème était similaire a ceux exposés ici sauf que ma base prend en compte les accents et que LIKE ne donne pas les résultats escomptés.

Partant de la il fallait trouver une soluce différente.

la mienne est un mix de plusieurs truc vu ici ou ailleurs a prendre pour ce que cela vaux :

le contexte php:

SELECT * FROM table WHERE champs = '$expression_recherchee'

la requête de base:

SELECT * FROM table WHERE keyword regexp'evenement insolite'

la requête idéale pour sortir tous les résultats accentués ou pas :

SELECT * FROM table WHERE keyword regexp'[eèéêë]v[eèéêë]n[eèéêë]m[eèéêë]nt [iìíîï]ns[oðòóôõö]l[iìíîï]t[eèéêë]'

la fonction qui va bien :
Code:
function regexAccents($chaine){
	$accent  =array('a','à','á','â','ã','ä','å','c','ç','e','è','é','ê','ë','i','ì','í','î','ï','o','ð','ò','ó','ô','õ','ö','u','ù','ú','û','ü','y','ý','ý','ÿ');
	$inter  =array('%01','%02','%03','%04','%05','%06','%07','%08','%09','%10','%11','%12','%13','%14','%15','%16','%17','%18',
								'%19','%20','%21','%22','%23','%24','%25','%26','%27','%28','%29','%30','%31','%32','%33','%34','%35');
	$regex=array('[aàáâãäå]','[aàáâãäå]','[aàáâãäå]','[aàáâãäå]','[aàáâãäå]','[aàáâãäå]','[aàáâãäå]',
								'[cç]','[cç]',
								'[eèéêë]','[eèéêë]','[eèéêë]','[eèéêë]','[eèéêë]',
								'[iìíîï]','[iìíîï]','[iìíîï]','[iìíîï]','[iìíîï]',
								'[oðòóôõö]','[oðòóôõö]','[oðòóôõö]','[oðòóôõö]','[oðòóôõö]','[oðòóôõö]','[oðòóôõö]',
								'[uùúûü]','[uùúûü]','[uùúûü]','[uùúûü]',
								'[yýýÿ]','[yýýÿ]','[yýýÿ]','[yýýÿ]');
	$chaine=str_replace($accent,$inter,$chaine);
	$chaine=str_replace($inter,$regex,$chaine);
	return $chaine;
}

pour ceux qui se poserait la question, la transformation de $expression_recherchee se fait en deux temps pour éviter que les expression régulières de remplacement soit elle même transformées par la fonction (caractère commun entre la source et la destination).
 
WRInaute occasionnel
Je relance aussi ce post pour encore des petites questions,

Je comprends qu'il y a plusieurs solutions :

1) Saisir les données sans accent : résultat : un site vraiment difficile à lire, moche à lire et qui fait vraiment pas pro. On fait tout pour éviter les fautes de français et c'est déjà pas facile alors....

2) Utiliser la fonction "LIKE" : qui indique (si j'ai bien compris) que avec ou sans accent, ça doit être la même chose.

3) La fonction "function regexAccents($chaine)" de Zeb que j'ai pas testé encore...

A votre avis, comment faire pour que ça s'affiche correctement dans mes pages html en passant par un script php qui cherche des données sur ma base SQL remplie elle-même à partir d'un fichier Excel ?

Actuellement, je rentre mes données dans mon Excel avec les accents normaux (éàû...) puis à l'aide d'une macro, je les récupère pour en faire une requète SQL sur un txt et les insère dans ma base.

Avant de les mettre sur la base, je peux changer tous les "é" en "&aecute;" ainsi que les autres caractères spéciaux mais, dans ce cas mes recherches ne fonctionnent plus...
 
WRInaute accro
alesque a dit:
Avant de les mettre sur la base, je peux changer tous les "é" en "&aecute;" ainsi que les autres caractères spéciaux mais, dans ce cas mes recherches ne fonctionnent plus...

As tu essayé de coder la chaine a rechercher de la même façon que le contenu (donc chaine a rechercher avec "&aecute;" pour é par exemple)

De mon côté j'ai laissé tomber la prise en compte des accents, j'utilise une requette Fulltext et si l'utilisateur ne connais pas l'orthographe exacte tant pis pour lui.
 
WRInaute occasionnel
J'ai un peu honte sur ce coup là : sur OVH, me demandez pas pourquoi, l'encodage avait changé et était passé en UTF-8... Je saivais même pas qu'on pouvait le changer sur MySql.
 
WRInaute discret
Salut et pourquoi ne pas utiliser une fonction de se style pour viré les accents :

Code:
function NoAccentFeed($text, $EncIn = 'CP1252'){
  return iconv($EncIn, 'ASCII//TRANSLIT//IGNORE', $text);
}
 
Discussions similaires
Haut