IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Utilisation un peu spéciale de preg_replace pour moteur de recherche


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 35
    Points
    35
    Par défaut Utilisation un peu spéciale de preg_replace pour moteur de recherche
    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 :
    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);
     
     
    	}
    }
    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.

    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.

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Je ne sais pas si ton site contient beaucoup de pages, mais peut etre serait il plus judicieux de réenregisrer tes pages sans la converson de caractères.

    Il existe un option qui permet de configurer TinyMCE de telle sorte à ce qu'il ne convertisse pas les caractères spéciaux.

    Il faut passer l'option entity_encoding à raw.

    http://www.tinymce.com/wiki.php/Conf...ntity_encoding
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 35
    Points
    35
    Par défaut
    Merci Seb pour cette idée mais j'y avait déjà pensé.

    Et en effet il y a beaucoup de page et de contenu déjà donc si je pouvais trouver une solution sans changer la configuration de tinyMCE, ça m'arrangerait bien.

Discussions similaires

  1. Réponses: 8
    Dernier message: 22/06/2009, 19h06
  2. Dictionnaire sémantique pour moteur de recherche?
    Par Glavio dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 20/07/2007, 12h36
  3. Probleme vba pour moteur de recherche ACCESS
    Par sylvaindenisbe dans le forum Modélisation
    Réponses: 1
    Dernier message: 10/05/2007, 15h30
  4. Algorithme d'indexation pour moteur de recherche
    Par caspertn dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 24/04/2006, 17h57
  5. Problème requete pour moteur de recherche
    Par vincedjs dans le forum Requêtes
    Réponses: 48
    Dernier message: 15/03/2006, 15h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo