Bonjour à tous,
Désolé pour le titre je ne voyais pas comment l'expliquer en quelques mots.
Voici le contexte:
Je réalise un moteur de recherche sur des pages de contenu (type CMS).
Les textes contenus dans la base de données sont encodés en HTML, j'ai donc tous mes accents convertis, par exemple "é" dans ma base est "é " (j'utilise tinyMCE).
Lorsque le visiteur tape un mot sans accent j'aimerai pouvoir le chercher et le trouvé même si il a un accent.
exemple :
mot saisie par le visiteur : preference
j'aimerai que ça me trouve : préférence
Voici le code que j'utilise :
Le problème est qu'il me remplace le "e" par ce qu'il faut mais ensuite même les voyelles dans les chaines de remplacement sont aussi remplacer, ce qui donne un remplacement d'un remplacement et ainsi de suite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
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
36
37
38
39
40
41
42
43
44 $pattern = array(); $pattern[0] = '/e/'; $pattern[1] = '/a/'; $pattern[2] = '/i/'; $pattern[3] = '/o/'; $pattern[4] = '/u/'; $pattern[5] = '/c/'; $replace_html = array(); $replace_html[0] = "(e|é|É|è|È|ê|Ê|ë|Ë)"; $replace_html[1] = "(a|à|À|â|Â|ä|Ä)"; $replace_html[2] = "(i|î|Î|ï|Ï)"; $replace_html[3] = "(o|ô|Ô|ö|Ö)"; $replace_html[4] = "(u|ù|Ù|û|Û|ü|Ü)"; $replace_html[5] = "(c|ç|Ç)"; $motscles = $_GET["motscles"]; $motscles = mysql_real_escape_string(trim($motscles)); if(!empty($motscles)) { $tab_mc = explode(" ",$motscles); $cptmot = 0; foreach($tab_mc as $k => $mot) { if(strlen($mot) > 2) { $mothtml = $mot; $motreg = $mot; $motreg = preg_replace($pattern,$replace_accent,$motreg); $mothtml = preg_replace($pattern,$replace_html,$mothtml); $mothtml = htmlentities($mothtml); if($cptmot > 0) $param_txt .= " AND "; $param_txt .= "T.contenu REGEXP '[[:<:]]".$mothtml."[[:>:]]'"; $cptmot++; } } if($cptmot) { $rcont = mysql_query("SELECT T.contenu, M.id, M.libelle FROM texte T LEFT OUTER JOIN page_contenu P ON P.id = T.idcontenu LEFT OUTER JOIN menu M ON P.idpage = M.id WHERE ".$param_txt); $nbcont = mysql_num_rows($rcont); } }
Y a t'il un moyen de ne pas remplacer les chaines qui ont servies de remplacement.
J'espère être assez clair, n'hésitez pas si vous avez besoin de précisions.
Merci d'avance.
Partager